核心数据后台通过新的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来parsing数据,然后更新核心数据中的复杂模式。 我会一直切换到主线程来实际更新核心数据。 凌乱的代码,大量调用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中的一些其他代码的小改动,以将父模型对象上下文types设置为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; } 

这似乎工作得很好。 整个更新过程仍然运行在一个单独的线程,但我不必创build一个线程。 看起来像魔术。

只要记住,如果要将更改提交到物理核心数据文件,那么在父上下文中也可以调用save:。

我在这里没有真正问过问题。 我发布这个,所以它可以帮助别人,因为当我search新的iOS5pipe理对象上下文方法时,发现的一切只给了高层次的细节,没有代码示例所有其他search在后台获取核心数据是旧的,有时很旧,并讨论如何在iOS5之前做到这一点。

是的 – 现在真的很简单(在iOS 5.0中)。 对于iOS 4的兼容性,以前的障碍仍然存在,但在线程限制文档不是太糟糕。 也许你应该把这个添加到wiki部分?

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

通常在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(); }); 

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

新的API似乎是这个模式的一个包装,其中child上下文看起来像是从父级的持久协调器中创build一个新的上下文。 并且在init上指定NSPrivateQueueConcurrencyType将确保在专用队列上执行performBlock参数。

新的API似乎没有太多的代码键入。 比“传统”线程有什么优势?