My iOS app hangs on savaging when i segue between 2 screens a couple of times.
it belongs to store the data but than this just freeze with no errors.
Somebody any idea how i can fix this ?
self.fetchF = dispatch_queue_create(label, NULL);
dispatch_async(self.fetchF, ^{
NSArray *feeds = [FeedFetcher getData:self.pageTitle downloadBy:@"up"];
NSManagedObjectContext *newContext = self.managedObject;
for (NSDictionary *feedInfo in feeds) {
[Feed FeedWithInfo:feedInfo InManageObject:newContext];
}
dispatch_async(dispatch_get_main_queue(), ^{
NSError *error = nil;
if (newContext != self.managedObject)
[newContext save:&error];
if (error)
NSLog(@"Error save : %@", error);
[self setupFetchedResultsController];
[self downloadImages:feeds];
});
});
Edit :
I change my managedobjectcontext so it has every thread a new one.
But now when i segue between 2 screens a couple of times it freeze on [self.fetchedResultsController performFetch:&error]; With no errors..
Does somebody a idea for a solution ?
- (void)performFetch
{
if (self.fetchedResultsController) {
if (self.fetchedResultsController.fetchRequest.predicate) {
if (self.debug) NSLog(@"[%@ %@] fetching %@ with predicate: %@", NSStringFromClass([self class]), NSStringFromSelector(_cmd), self.fetchedResultsController.fetchRequest.entityName, self.fetchedResultsController.fetchRequest.predicate);
} else {
if (self.debug) NSLog(@"[%@ %@] fetching all %@ (i.e., no predicate)", NSStringFromClass([self class]), NSStringFromSelector(_cmd), self.fetchedResultsController.fetchRequest.entityName);
}
NSError *error;
if (self.fetchedResultsController != nil)
[self.fetchedResultsController performFetch:&error];
if (error) NSLog(@"[%@ %@] %@ (%@)", NSStringFromClass([self class]), NSStringFromSelector(_cmd), [error localizedDescription], [error localizedFailureReason]);
} else {
if (self.debug) NSLog(@"[%@ %@] no NSFetchedResultsController (yet?)", NSStringFromClass([self class]), NSStringFromSelector(_cmd));
}
[self.tableView reloadData];
}
Core Data is generally not thread-safe. Rule of thumb is to create a
NSManagedObjectContextper thread. I believe you’re reusing your context among threads and that’s causing the problem.Docs on Core Data concurrency: