인스트루먼트를 사용한 후 코드가 매우 길어서 내 UI가 차단되는 지점을 발견했습니다. 코어 데이터 페치가 많이 발생했습니다 (큰 JSON 패킷을 처리하는 과정의 일부이므로 개체가 복제되지 않도록하면서 관리되는 개체 구축).NSOperationQueues를 사용하는 코어 데이터 및 동시성
내 의도는이 요청을 더 작은 조각으로 나누어 연속적으로 처리하는 것이지만, 그 의미는 내가 그 페치를 펼칠 것임을 의미합니다. 효과는 하나의 길 대신에 작은 크기의 갑작스런 갑작스런 소리가 될 것으로 예상합니다. 딸꾹질.
Apple의 워드 프로세서와 온라인 블로그에서 읽은 모든 내용은 핵심 데이터 및 동시성이 벌집을 파킹하는 것과 비슷하다는 것을 나타냅니다. 그래서, 소심히 나는 그것을 대학에 진학시키기 위해 앉았다. 아래는 내가 생각해내는 것입니다. 나는 내가 작성한 오류가 있음을 지적하면서 누군가를 현명하게 평가할 것입니다.
아래에 게시 된 코드는 작동합니다. 내가 읽은 것은 내가 분명히 그릇된 일을했다는 것을 두려워하게했다. 나는 수류탄에서 핀을 뽑아 내고 예기치 않게 떨어져 나가는 것을 기다리고있는 것처럼 느껴집니다! 당신은 당신이 iOS5를 위해 그 일을해야 NSPrivateQueueConcurrencyType을 사용하고 있기 때문에
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