ネストされたコンテキストの背後に魔法はありません。追加の作業なしでは、並行性に関連する多くの問題を解決することはできません。多くの人 (あなたもその一人のようです) は、動作するはずのないものがすぐに動作することを期待しています。以下に、背景情報を少し示します。
プライベート キュー同時実行タイプを使用して子コンテキストを作成すると、Core Data はこのコンテキストのキューを作成します。このコンテキストで登録されたオブジェクトと対話するには、performBlock: または performBlockAndWait: のいずれかを使用する必要があります。これら 2 つのメソッドが行う最も重要なことは、コンテキストのキューで渡されたブロックを確実に呼び出すことです。それ以上でもそれ以下でもありません。
非 Core Data ベースのアプリケーションのコンテキストでこれについて少し考えてみてください。バックグラウンドで何かをしたい場合は、新しいキューを作成し、ブロックをスケジュールしてバックグラウンドでそのキューで作業を行うことができます。ジョブが完了したら、バックグラウンド操作の結果をアプリ ロジック内の別のレイヤーに伝えます。バックグラウンド操作の結果に関連するオブジェクト/データをユーザーがその間に削除するとどうなりますか? 基本的に同じ: クラッシュ。
あなたが経験したことは、Core Data 固有の問題ではありません。これは、並行性を導入するとすぐに発生する問題です。必要なのは、子コンテキストと親コンテキストの間のポリシーまたはある種の契約について考えることです。たとえば、ルート コンテキストからオブジェクトを削除する前に、他のキューで実行されているすべての操作/ブロックをキャンセルし、キャンセルが完了するまで待ってからオブジェクトを実際に削除する必要があります。