Фоновая выборка Core Data с помощью нового NSPrivateQueueConcurrencyType

Неужели теперь это так просто в 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.

57
задан Paul Heller 29 November 2011 в 02:49
поделиться