通过新的NSPrivateQueueConcurrencyType获取核心数据背景

Pau*_*ler 57 core-data ios5

现在在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);
Run Code Online (Sandbox Code Playgroud)

我的下载类执行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];
    }];
Run Code Online (Sandbox Code Playgroud)

以及我的AppDelegate中的一些其他代码的小改动,以将父模型对象上下文类型设置为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;
}
Run Code Online (Sandbox Code Playgroud)

它似乎工作得很好.整个更新过程仍然在一个单独的线程中运行,但我没有必要创建一个线程.看起来像魔术.

请记住,如果要将更改提交到物理核心数据文件,则还要在父上下文中调用save:.

我这里真的没问过问题.我发布这个以帮助其他人,因为我在搜索新的iOS5托管对象上下文方法时发现的所有内容都只提供了高级别的详细信息而没有代码示例而在后台获取核心数据的所有其他搜索都是旧的,有时候很旧,并讨论如何在iOS5之前做到这一点.

Jor*_*ers 0

我试图了解这个新 API 是如何实现的。我通常的多线程核心数据模式是这样的:

通常在本示例中NSOperation使用但经过简化dispatch_async

dispatch_queue_t coredata_queue; // some static queue

dispatch_async(coredata_queue, ^() {
    // get a new context for this thread, based on common persistent coordinator
    NSManagedObjectContext *context = [[MyModelSingleton model] threadedContext];

    // do something expensive

    NSError *error = nil;
    BOOL success = [context save:&error];
    if (!success) {
        // the usual.
    }

    // callback on mainthread using dispatch_get_main_queue();
});
Run Code Online (Sandbox Code Playgroud)

然后主线程将通过更新 UI 来响应以NSManagedObjectContextDidSaveNotification合并主上下文。

新的 API 似乎是此模式的包装器,其中child上下文看起来只是从其父级获取持久协调器来创建新上下文。在 init 上指定 NSPrivateQueueConcurrencyType将确保该performBlock参数在专用队列上执行。

新的 API 似乎并没有减少需要输入的代码。与“传统”线程相比有什么优势吗?