一般的に NSObjectInaccessbileExceptions について理解し、別のマネージド コンテキスト/スレッドで削除されたオブジェクトで障害を起こさないようにする必要があることを理解しています。
しかし、私のユーザー クラッシュ レポートでは、子 NSManagedObjectContext をバックグラウンド スレッド (B) からメイン コンテキスト (A) にマージ/保存しているときに NSObjectInaccessibleException が発生しています。これは異常なシナリオのようです。
そのようなことを引き起こす可能性があると私が想像できる唯一の状況は次のとおりです。
- スレッド/コンテキスト内のオブジェクトのプロパティを変更 (B)
- スレッド/コンテキスト A のオブジェクトを削除
- 保存コンテキスト A
- 保存コンテキスト B
- A を B にマージして A を保存 -> オブジェクトが A に存在しないために発生した例外。
このようなコンテキストを保存しているときに、他の誰かが例外を見たことがありますか? これを手動で再現しようとしましたが、失敗しました。これが発生する可能性のある他のシナリオはありますか?また、そのような問題に対処するためのヒントはありますか?
ありがとう!
Fatal Exception
NSObjectInaccessibleException
CoreData could not fulfill a fault for '0x1f019da0 <x-coredata://741E65A8-C211-470E-8194-3005F0DFA71C/TrackInfo/p265>'
0 CoreFoundation __exceptionPreprocess + 162
1 libobjc.A.dylib objc_exception_throw + 30
2 CoreData _PFFaultHandlerLookupRow + 1482
3 CoreData -[NSFaultHandler fulfillFault:withContext:] + 24
4 CoreData -[NSManagedObject(_NSInternalMethods) _updateFromRefreshSnapshot:includingTransients:] + 236
5 CoreData -[NSManagedObjectContext(_NestedContextSupport) _copyChildObject:toParentObject:fromChildContext:] + 96
6 CoreData -[NSManagedObjectContext(_NestedContextSupport) _parentProcessSaveRequest:inContext:error:] + 918
7 CoreData __82-[NSManagedObjectContext(_NestedContextSupport) executeRequest:withContext:error:]_block_invoke_0 + 564
8 libdispatch.dylib _dispatch_barrier_sync_f_slow_invoke + 96
9 libdispatch.dylib _dispatch_client_callout + 22
10 libdispatch.dylib _dispatch_main_queue_callback_4CF + 228
11 CoreFoundation __CFRunLoopRun + 1288
12 CoreFoundation CFRunLoopRunSpecific + 356
13 CoreFoundation CFRunLoopRunInMode + 104
14 GraphicsServices GSEventRunModal + 74
15 UIKit UIApplicationMain + 1120
16 app main.m line 13 main
17 app start