Core Data+concurrency/nested MOC の処理に問題があります (=P でどれに問題があるかわかりません)。
管理オブジェクト ID を渡すメソッドがあり (永続的であることを確認しました)、そのメソッドには、特定のキューに限定された子管理オブジェクト コンテキストがあります。を介して子マネージド オブジェクト コンテキストからオブジェクトを取得できますが[managedObjectContext objectWithID:moID]
、そのプロパティのいずれかにアクセスしようとすると (マネージド オブジェクトはまだエラーです)、EXC_BAD_ACCESS
スタック トレースに と が表示_svfk_1
されobjc_msgSend
ます。
サンプル コードがないと問題の原因を特定するのは難しいことは承知していますが、考えられる原因について誰かが明らかにしてくれることを期待していました。ありがとう。=)
編集:existingObjectWithID:error:
Tom Harringtonが提案した代わりに使用してみましobjectWithID:
たが、時々機能しますが、他の時間は機能しません。EXC_BAD_ACCESS
でのクラッシュも経験しましたmergeChangesFromContextDidSaveNotification:
。これは同期の問題であると思われます。あるコンテキストで何かを編集し、子コンテキストで他の何かを編集している間に保存すると、問題が発生しますか?
編集 2: existingObjectWithID:error: が常にではなく時々機能する理由がわかりました。管理オブジェクト ID は確かに一時的な ID でした (永続的な ID に変換すべきではありませんか?) ため、ID を渡す前mergeChangesFromContextDidSaveNotification:
に呼び出す必要がありました。obtainPermanentIDsForObjects:error:
しかし、私はまだ子コンテキストの でクラッシュすることがありますmergeChangesFromContextDidSaveNotification:
。これの考えられる原因は何ですか?ありがとう。
編集 3:私の MOC 階層は次のようになります。
Persistent Store Coordinator
|
Persistent Store MOC
/ \
Main Queue MOC Child MOC (confinement)
Child MOC (別のキュー内) を使用していくつかのマネージド オブジェクトを挿入および更新するメイン キューからメソッドを呼び出しています。同時に、Persistent Store MOC 内のマネージド オブジェクトを挿入および更新しています。管理対象オブジェクトは、メイン キュー MOC で同時に更新、削除、および挿入することもできます。Persistent Store Coordinator からのすべての変更を Main Queue MOC と Child MOC の両方にマージします。
いくつかの質問: MOC を保存すると自動的にマージされますか? MOC の保留中のマージ リクエストがあり、そのマージ リクエストが処理される前に保存すると、問題が発生する可能性がありますか?
編集 4:子 MOC を初期化する方法は次のとおりです。
dispatch_sync(_searchQueue, ^{
_searchManagedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSConfinementConcurrencyType];
[_searchManagedObjectContext setParentContext:_persistentStoreManagedObjectContext];
[_searchManagedObjectContext setMergePolicy:NSMergeByPropertyStoreTrumpMergePolicy];
});
EXC_BAD_ACCESS
ところで、通知に削除されたオブジェクトが含まれている場合にのみマージがクラッシュすることに気付きました。