使用Instruments之后,我发现我的代码中存在很长时间的运行并阻塞了我的用户界面:处理大量JSON数据包的一部分,建立管理对象,同时确保对象不被复制)。虽然我的意图是将这个请求分解为更小的部分并连续地处理它们,但这只意味着我将分散这些提取 - 我预计效果将是应用程序中的小动作,而不是一个漫长的打嗝。使用NSOperationQueues的核心数据和并发性
我在Apple的文档和在各种博客文章中都阅读过的所有内容都表明,Core Data和并发性类似于戳一个蜂巢。所以,我怯怯地坐下来给大学尝试。下面是我想到的,我会很感激有人更明智地指出我确信我写的任何错误。
下面的代码发布作品。我读过的东西让我感到害怕,因为我确实做错了什么;我觉得如果把手雷拔出手榴弹,我只是在等待它出乎意料!
NSBlockOperation *downloadAllObjectContainers = [NSBlockOperation blockOperationWithBlock:^{
NSArray *containers = [webServiceAPI findAllObjectContainers];
}];
[downloadAllObjectContainers setCompletionBlock:^{
NSManagedObjectContext *backgroundContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[backgroundContext setPersistentStoreCoordinator:[_managedObjectContext persistentStoreCoordinator]];
[[NSNotificationCenter defaultCenter] addObserverForName:NSManagedObjectContextDidSaveNotification
object:backgroundContext
queue:[NSOperationQueue mainQueue]
usingBlock:^(NSNotification *note) {
[_managedObjectContext mergeChangesFromContextDidSaveNotification:note];
}];
Builder *builder = [[Builder alloc] init];
[builder setManagedObjectContext:backgroundContext];
for (ObjectContainer *objCont in containers) { // This is the long running piece, it's roughly O(N^2) yuck!
[builder buildCoreDataObjectsFromContainer:objCont];
}
NSError *backgroundContextSaveError = nil;
if ([backgroundContext hasChanges]) {
[backgroundContext save:&backgroundContextSaveError];
}
}];
NSOperationQueue *background = [[NSOperationQueue alloc] init];
[background addOperation:downloadAllObjectContainers];
我只在iOS 5上使用它。 “核心数据并发”文章没有提到这一点,我无法找到你在iOS 5.0 API Diffs中提出的建议。 NSManagedObjectContext的文档对于那些常量来说有点简洁。你能否指引我参考你参考的文档的方向? – edelaney05
当然,我编辑了原帖以解答您的评论。 – svena