核心数据后台通过新的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似乎没有太多的代码键入。 比“传统”线程有什么优势?