在使用 Instruments 之后,我发现我的代码中有一个地方运行时间很长并且阻塞了我的 UI:大量核心数据获取(这是摄取大型 JSON 数据包和构建托管对象同时确保对象的过程的一部分)没有重复)。
虽然我的意图是将这个请求分解成更小的部分并连续处理它们,但这仅意味着我将分散这些提取 - 我预计效果将是应用程序中的小突发而不是长时间的打嗝。
我在 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];