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によってグラフの分離が保証される可能性があります。私は、この問題がAFNetworkに対して提起が見つかりました:

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

それはAサイクルを維持することに疑い類似していることにより、それが永久に親コンテキスト内に存在し、障害にしようとしてデッドロックさせ、割り当てが解除されることからオブジェクトを防止しました。

+0

+1です。このシナリオを修正できるソリューション/リファクタがありますか? – sbonami

+0

確かに、私はいくつかの提案で私の答えを修正します、あなたはこのようにネストされたコンテキストを使用するためのあなたの動機を説明できますか? – ImHuntingWabbits

+0

AFIncrementalStoreの@ matttのリードの後に​​は、私はこのパターンの動機付けがありません。任意の提案はあなたに感謝しています:) – sbonami

関連する問題