I haben einen Kern-Daten-Anwendung, die ohne Absturz läuft, wenn ich eine durchführen fetch innen viewDidLoad
wie folgt aus:Coredata Fetch Crashes verwendet, wenn mit dispatch_async
- (void) performCoreDataFetch {
NSError *error;
if (![[self fetchedResultsController] performFetch:&error]) {
exit(-1); // Fail
}
}
- (void)viewDidLoad {
[super viewDidLoad];
[self performCoreDataFetch];
}
Das einzige Problem bei der obigen Weise fetch der Durchführung ist, wenn Die Daten, die zurückgegeben werden sollen, sind groß, es friert die App für ein paar Sekunden ein (aber gibt das korrekte Ergebnis ohne Absturz jedes Mal zurück), um zu vermeiden, dass ich dispatch_async (Code unten) benutze und [self performCoreDataFetch]
darin anrufe.
Aber wenn ich das gleiche [self performCoreDataFetch] laufen innerhalb dispatch_sync innerhalb viewDidLoad, wie unten ,:
gezeigtdispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[self performCoreDataFetch];
dispatch_async(dispatch_get_main_queue(), ^{
[self.tableView reloadData];
});
});
Aufruf [self performCoreDataFetch]
innerhalb dispatch_async stürzt die zufällig app "-[NSFetchRequest fetchLimit]: message sent to deallocated instance
"
sagen Meine fetchedResultsController-Methode sieht wie folgt aus:
- (NSFetchedResultsController *)fetchedResultsController {
if (fetchedResultsController != nil) {
return fetchedResultsController;
}
// Create and configure a fetch request with the Organization entity
NSFetchRequest *request = [[NSFetchRequest alloc] init];
request.entity = [NSEntityDescription entityForName:@"Organization" inManagedObjectContext:managedObjectContext];
request.fetchBatchSize = 20;
// create sortDescriptor array
NSSortDescriptor *nameDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES selector:@selector(caseInsensitiveCompare:)];
NSArray *sortDescriptorArray = [NSArray arrayWithObjects:nameDescriptor, nil];
request.sortDescriptors = sortDescriptorArray;
NSPredicate *predicate = nil;
predicate = [NSPredicate predicateWithFormat:@"state LIKE %@", filterByState];
[request setPredicate:predicate];
// Create and initialize the fetchedResultsController
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc ] initWithFetchRequest:request managedObjectContext:managedObjectContext sectionNameKeyPath:@"uppercaseFirstLetterOfName" cacheName:nil];
self.fetchedResultsController = aFetchedResultsController;
fetchedResultsController.delegate = self;
// Memory management
filterByState = nil;
// [sortDescriptorArray release];
[nameDescriptor release];
// [predicate release];
[request release];
[aFetchedResultsController release];
return fetchedResultsController;
}
Was versuchen Sie zu erreichen? Sie sollten die Methode "performFetch" nicht selbst aufrufen müssen ... – Mundi
Ohne performFetch ist mir keine andere Möglichkeit bekannt, einen Core Data Fetch auszuführen. – Stealth
Was versuchst du zu erreichen? Wenn Sie den abgerufenen Results-Controller langsam initialisieren, wird der Abruf dort durchgeführt, ohne dass Sie 'performFetch' selbst aufrufen müssen. Nochmal, was versuchst du mit dem Fetch zu machen? – Mundi