これは複雑なものです。バックグラウンドで実行時間の長いタスクを実行し、データベースを更新する IOS アプリがあります。個別に管理されたオブジェクト コンテキストを作成し、永続ストア コーディネーターを共有します。
また、通知リスナーを追加し、変更通知を関連するコンテキストの processPendingChanges メソッドに渡します。(双方向で処理)
私たちが見ているのは、バックグラウンド スレッドが複数のオブジェクトを削除していることです。トランザクションではありません。バックグラウンド スレッドが完了し、すべての変更が保存されます。次に、フォアグラウンドで操作が実行され、ロールバックが実行されます。
これにより、削除されたオブジェクトの一部が再表示されます。(executeFetchRequest がそれらを見つけます。) これらのオブジェクトは無効であり、それらを使用するとアプリがクラッシュします。
これは、バックグラウンド スレッドがオブジェクトを削除する前に、フォアグラウンド コンテキストがそれらのオブジェクトにアクセスした場合にのみ発生します。バックグラウンドからの変更通知がフォアグラウンド コンテキストに送信され、フォアグラウンド スレッドで処理されていることを確認しました。
ロールバックを呼び出す前にオブジェクトがフォアグラウンド コンテキストに存在しないこと、およびロールバック後にオブジェクトが存在することを確認しました。(ただし、完全に有効というわけではありません。) バックグラウンド コンテキストから変更通知を受け取ったときに、フォアグラウンド コンテキストが削除されたオブジェクトをキャッシュから削除していないように見えます。