1

コアデータと通知について質問があります。Appleのドキュメントを読んだ後、答えが見つかりませんでした。

これが問題です
。1対多の関係を持つ管理対象オブジェクトがあります。オブジェクトがこの関係に追加または削除された時期を知りたいのですが。(「カテゴリ」には多くの「アイテム」があります)これを使用して、アイテムのカテゴリがいつ追加または削除されるかを確認します。

[category addObserver:self forKeyPath:@"items" 
   options:NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew 
   context:nil];

そして、このメソッドは次のように呼び出されます。

- (void)observeValueForKeyPath:(NSString *)keyPath 
   ofObject:(id)object change:(NSDictionary *)change context:(void *)context;

問題:
カテゴリに2つのアイテムがあり、そのうちの1つを削除するとします。現在、カテゴリには1つのアイテムしかありません。ただし、からフェッチされたリクエストを起動するobserveValueForKeyPathと、カテゴリに2つのアイテムがあると表示されますが、現在は1つあるため、これは誤りです。

observeValueForKeyPathこれは、コンテキストが保存されているときに呼び出されるためだと思います(これは、Appleのドキュメントで見つけた唯一のことです)。おそらく、行が終了[context save:&error]するまで変更は有効ではありません。[context save:&error]したがって、理論をテストするために、observeValueForKeyPathコードを変更し、すべてのコードをメソッド内に移動して、次を使用しました。

 [self performSelector:@selector(launchFetchedRequest) 
   withObject:nil afterDelay:0];

そのメソッドを実行するために、次の実行ループ、つまり。の後[context save:&error]。そして、voilá、すべてが今うまくいきます。

したがって、内部observeValueForKeyPathでフェッチリクエストを起動する場合、次の実行ループで起動する必要がありますか?これは正常な動作ですか?通常、これをどのように行いますか?

このトピックについてのあなたの考えを知りたいです。前もって感謝します。

4

2 に答える 2

1

私はそこからフェッチを試みたことがありません。さらに、変更を有効にするために使用しているMOCと、クエリを実行するために使用しているMOCについては言及していません。

それはさておき、フェッチに関連するほとんどの問題は、shouldRefreshRefetchedObjectsの設定の結果であると思ったものが返されません。

使用しているNSFetchRequestのshouldRefreshRefetchedObjectsプロパティが、目的の結果が得られるように適切に構成されていることを確認してください。

于 2012-04-17T00:55:16.600 に答える
1

リカルド、

パラメータを使用しobjectます。それはあなたのcategoryコレクションです。何が含まれているのかを確認するだけなので、クエリを実行して管理対象オブジェクトのコンテキストにアクセスする必要はありません。

ここでの問題は、コレクションが変更されたときに通知イベントが発生し(KVO)、別のスレッドループを使用し、メインスレッドが変更を管理対象オブジェクトコンテキストにまだ伝播していないことです。パラメータを使用した場合はobject、正しいはずです。

于 2012-04-17T01:31:05.887 に答える