5

NSMainQueueConcurrencyType이 아닌 NSPrivateQueueConcurrencyType 동시성 유형의 동결 (교착 상태)가 발생합니다.existingObjectWithID NSPrivateQueueConcurrencyType을 사용하여 교착 상태가 발생했습니다.

내 상황에 맞는 초기화 :

_managedObjectContext = [[NSManagedObjectContext alloc] 
initWithConcurrencyType:NSPrivateQueueConcurrencyType]; 
[_managedObjectContext setPersistentStoreCoordinator:coordinator]; 

성가신 코드 :

NSManagedObjectID *managedObjectID = [self managedObjectIDForEntity:entity 
withParseObjectId:object.objectId]; 
managedObject = [context existingObjectWithID:managedObjectID error:error]; 

역 추적 :이 문제에 약간의 문맥 Github에서 projectopen issuebacktrace

연결합니다.

답변

4

얼굴에 자신을 쏜 것입니다.

executeFetchRequest:error:은 (부모의 대기열이 차단 된 상태에서) 일부 작업을 수행하는 별도의 하위 컨텍스트를 만듭니다. 이 작업에는 작업을 부모 대기열에 동시에 전송하는 작업이 포함됩니다 (insertOrUpdateObjects: 통해).

중첩 된 컨텍스트가있는 NSManagedObjectContext-existingObjectWithId:이 상위 컨텍스트로 폴트 된 개체를 수행하기 위해 부모 대기열로 발송되기 때문입니다. 안타깝게도 하위 컨텍스트에서 performBlockAndWait으로 부모 대기열을 이미 차단했습니다.

큰 슬픔이 계속됩니다.


편집 : 가능한 솔루션

여기서 문제에 대한 생각이 서로 다른 큐와 중첩 된 컨텍스트의 사용에 의해 발생합니다. 제공된 컨텍스트가 NSMainQueueConcurrencyType이 아니라면이 상황에서 중첩 된 컨텍스트를 사용하려는 동기를 잘 모르겠습니다.

불러 오기 컨텍스트의 큐에서 가져 오기 작업을 강제 실행해도 위험합니다. 가져 오기의 기존 개체가 오류가 발생하면이 문제의 희생 대상이되기 때문에 위험합니다.

AFIncrementalStore가이 상황에서 그래프 격리를 보장 할 수 있습니다.

https://github.com/AFNetworking/AFIncrementalStore/commit/1f822279e6a7096327ae56a2f65ce8e2ff36da83

그것은하는 유지주기에서 의심과 유사하여 영구적으로 부모 컨텍스트에 존재 및 오류하려고 교착 상태의 원인이 할당 해제되는 객체를 방지 : 나는 AFNetwork 상대로이 문제를 발견했다.

+0

+1 설명. 이 시나리오를 수정할 수있는 제안 된 솔루션/리팩터링이 있습니까? – sbonami

+0

물론, 내 대답을 약간의 제안으로 수정하겠다. 이런 식으로 중첩 된 컨텍스트를 사용하려는 동기를 설명 할 수 있습니까? – ImHuntingWabbits

+0

AFIncrementalStore에서 @ mattt의 단서를 따를 것 외에는이 패턴에 대한 동기가 없습니다. 모든 제안은 감사하고 있습니다 :) – sbonami