Неужели теперь это так просто в iOS5?
Я используется для выполнения фоновой выборки с использованием этого кода в моем AppDelegate:
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);
Мой класс загрузки выполняет NSURLConnection для извлечения некоторых данных XML, использует NSXMLParser для анализа данных, а затем обновляет сложную схему в основных данных. Я всегда переключался на основной поток, чтобы обновить основные данные. Грязный код с множеством вызовов dispatch_sync (dispatch_get_main_queue () ....
Мой новый код выглядит следующим образом:
NSManagedObjectContext *child = [[NSManagedObjectContext alloc]initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[child setParentContext:self.managedObjectContext];
[child performBlock:^{
self.myDownloadClass = [[MyDownloadClass alloc]initInManagedObjectContext:child];
[self.myDownloadClass download];
}];
вместе с небольшим изменением другого кода в моем AppDelegate для установки типа контекста объекта родительской модели to NSMainQueueConcurrencyType:
- (NSManagedObjectContext *)managedObjectContext
{
if (__managedObjectContext != nil)
{
return __managedObjectContext;
}
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (coordinator != nil)
{
__managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
[__managedObjectContext setPersistentStoreCoordinator:coordinator];
}
return __managedObjectContext;
}
Кажется, это работает очень хорошо. Весь процесс обновления по-прежнему выполняется в отдельном потоке, но мне не нужно было создавать поток. Похоже на волшебство.
Просто помните, если вы хотите зафиксировать свои изменения к файлам физических данных ядра у вас есть вызов save: и в родительском контексте.
Я действительно не задавал здесь вопросов. Я публикую это, чтобы помочь другим, потому что все, что я нашел при поиске нового Методы контекста управляемого объекта iOS5 давали только подробности высокого уровня без примеров кода. Все другие поиски для выборки основных данных в фоновом режиме старые, иногда очень старые, и обсуждается, как это сделать до iOS5.