1

私はこの質問について頭がおかしくなっています。

そのため、iOS アプリで Core Data を次のようにセットアップしました: http://www.cocoanetics.com/2012/07/multi-context-coredata/

次に、一時的な MOC を作成してオブジェクトを挿入し (ブログ投稿で説明されているように)、performBlock: メソッドで 3 つのコンテキストすべてに対して保存を実行します。

ビューコントローラーには があり、NSFetchedResultsController実際に新しいオブジェクトを挿入したことが通知されます。問題は、NSFetchedResultsChangeInsertが 2 回起動され、通過するたびにオブジェクトが異なるobjectID(メモリ内の異なるオブジェクト インスタンスでもある) ことです。何が起こるかというと、テーブル ビューに 2 つの行が挿入されていますが、SQL データベースには新しい行が 1 つしかありません。もちろん、テーブルビューの一番下までスクロールするとクラッシュします。

オブジェクトに対していくつかの更新も実行するNSFetchedResultsChangeUpdateと、1 回だけ呼び出され、2 回目の呼び出しで渡された objectID が使用されNSFetchedResultsChangeInsertます。

最初の ID は次のようになります。

<x-coredata:///ReceivedMessage/t605BB9A7-A04E-4B89-B568-65B12E8C259A2>

2 番目 (および後続のすべてのもの) は次のようになります。

<x-coredata://02A917C5-850F-4C67-B8E4-1C5790CF3919/ReceivedMessage/p28>

これは何ですか?明らかな何かを見逃していますか?

PS:通知が同じコンテキスト、スレッドなどから来ているかどうかも確認しました。そうです。

4

1 に答える 1

3

表示されている 2 つの ID は、1 つのオブジェクトを表している可能性があります。それらの違いは、最初のものは作成時にオブジェクトに割り当てられる一時的なオブジェクト ID であり、2 つ目は管理対象オブジェクト ストアに格納されるときにオブジェクトに割り当てられる永続的なオブジェクト ID であることです ( NSManagedObjectID の isTemporaryIDを参照)。 )。

この問題を回避するには、一時的な MOC を保存する直前にNSManagedObjectContext の acquirePermanentIDsForObjects:error:を呼び出すことができます。このようにして、挿入されたオブジェクトは、保存の伝播中に 1 つの ID を持つだけになり、NSFetchedResultsControllerDelegate メソッドは 1 回だけ呼び出されます。

于 2013-03-31T18:12:28.067 に答える