使用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