私のアプリは、必ずしも保存する必要のないオブジェクトをマネージド オブジェクト コンテキストに挿入することがあります。たとえば、「エンティティの追加」モーダルを起動すると、マネージド オブジェクトを作成してモーダルに割り当てます。ユーザーがそのモーダルから保存すると、コンテキストが保存されます。彼がキャンセルした場合、私はオブジェクトを削除し、保存は必要ありません。
(URL スキームを使用して) アプリに切り替えてエンティティを追加する「インポート」機能を導入しました。これらのモーダルの 1 つが開いている可能性があるため、この時点でコンテキストを保存するのは安全ではありません。モーダル用に作成された一時オブジェクトは、ユーザーがキャンセルしても保存されます。(キャンセル操作による) 削除が後で保存されるという保証はありません。ユーザーがアプリを終了する可能性があります。
同様に、アプリが終了するたびに単純に保存することはできません。その時点でモーダルが開いていると、一時オブジェクトが正しく保存されません。
これに対処するために、ここで説明したように、子コンテキストを使用しようとしています。SOで見つけたものをすべて読んだので、いくつか質問があります。
各コンテキストにどの同時実行タイプを使用する必要がありますか? パフォーマンス/スレッドの利点のためにこれを行っているわけではないことに注意してください。子コンテキストを持つ場合、メイン コンテキストに NSConfinementConcurrencyType を使用できないことはわかっていますが、他の 2 つのオプションのどちらが最適かはわかりません。子コンテキストの場合、一致する必要がありますか? それとも、ここで監禁タイプを使用できますか?さまざまな組み合わせを試してみましたが、すべて問題なく動作しているように見えますが、自分の要件に適したものを知りたいです。
(副次的な問題) クラス iVar を使用する場合にのみ、これを機能させることができるのはなぜですか? 作成されたメソッドで一時的なコンテキストを宣言し、後で entity.managedObjectContext を使用して参照できるようにすべきだと考えました。でもアクセスしてくる頃には無くなっているような?代わりに iVar を使用して参照を保持すると、これは修正されます。
メインコンテキストへの変更を反映する正しい方法は何ですか? 各コンテキストで異なるブロックラップ実装を使用するさまざまなコメントを見てきました。同時実行タイプに依存しますか? 私の現在のバージョンは次のとおりです。
//save the new entity in the temporary context NSError *error = nil; if (![myObject.managedObjectContext save:&error]) {NSLog(@"Error - unable to save new object in its (temporary) context");} //propogate the save to the main context [self.mainContext performBlock:^{ NSError *error2 = nil; if (![self.mainContext save:&error2]) {NSLog(@"Error - unable to merge new entity into main context");} }];
ユーザーが保存すると、デリゲート (メイン ビュー コントローラー) にメッセージが送信されます。デリゲートには、追加されたオブジェクトが渡され、メイン コンテキストで同じオブジェクトを見つける必要があります。しかし、メイン コンテキストで検索しても見つかりません。メイン コンテキストにはエンティティが含まれています - 詳細をログに記録し、そこに存在することを確認できます - しかし、アドレスは異なりますか? これが意図されている場合 (なぜですか?)、保存後に追加されたオブジェクトをメイン コンテキストで見つけるにはどうすればよいですか?
洞察をありがとう。長くて複数の部分からなる質問で申し訳ありませんが、誰かが以前にこれらすべての問題に対処した可能性が高いと思いました。