Ist es jetzt in iOS5 wirklich so einfach?
Ich habe mit diesem Code in meinem AppDelegate einen Hintergrundabruf durchgeführt:
dispatch_queue_t downloadQueue = dispatch_queue_create("DownloadQueue", NULL);
dispatch_async(downloadQueue, ^{
self.myDownloadClass = [[MyDownloadClass alloc]initInManagedObjectContext:self.managedObjectContext];
[self.myDownloadClass download];
});
dispatch_release(downloadQueue);
Meine Download-Klasse führt eine NSURLConnection aus, um einige XML-Daten abzurufen, verwendet NSXMLParser, um die Daten zu parsen, und aktualisiert dann ein komplexes Schema in den Kerndaten. Ich würde immer zum Hauptthread wechseln, um die Kerndaten zu aktualisieren. Unübersichtlicher Code mit vielen Aufrufen von dispatch_sync(dispatch_get_main_queue()....
Mein neuer Code sieht wie folgt aus:
NSManagedObjectContext *child = [[NSManagedObjectContext alloc]initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[child setParentContext:self.managedObjectContext];
[child performBlock:^{
self.myDownloadClass = [[MyDownloadClass alloc]initInManagedObjectContext:child];
[self.myDownloadClass download];
}];
zusammen mit einer kleinen Änderung an etwas anderem Code in meinem AppDelegate, um den übergeordneten Modellobjektkontexttyp auf NSMainQueueConcurrencyType zu setzen:
- (NSManagedObjectContext *)managedObjectContext
{
if (__managedObjectContext != nil)
{
return __managedObjectContext;
}
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (coordinator != nil)
{
__managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
[__managedObjectContext setPersistentStoreCoordinator:coordinator];
}
return __managedObjectContext;
}
Es scheint sehr gut zu funktionieren. Der gesamte Aktualisierungsprozess läuft immer noch in einem separaten Thread, aber ich musste keinen neuen Thread erstellen. Scheint wie Magie.
Denken Sie daran, dass Sie auch im übergeordneten Kontext save: aufrufen müssen, wenn Sie Ihre Änderungen an den physischen Kerndateien festschreiben wollen.
Ich habe hier nicht wirklich eine Frage gestellt. Ich poste dies, damit es anderen hilft, weil alles, was ich bei der Suche nach den neuen iOS5 verwalteten Objektkontextmethoden gefunden habe, nur High-Level-Details ohne Code-Beispiele gab und alle anderen Suchen für das Abrufen von Kerndaten im Hintergrund alt sind, manchmal sehr alt, und diskutieren, wie man es vor iOS5 zu tun.