现在在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之前做到这一点.