6

まず、エンティティ「Entity」のすべてのオブジェクトをフェッチするを使用しNSFetchedResultsControllerてを作成します。NSFetchRequest

次に、「エンティティ」のインスタンスである新しいNSManagedObject Aと、「エンティティ」のインスタンスでもある編集Bを挿入します。

それから私は電話NSArray *result = [fetchedResultsController -fetchedObjects]します、結果としてAとBはありますか?

プロジェクト全体を通して、私は1つのNSManagedObjectContextのみを使用します。

私がそうする場合、これはその文書で何を意味しますか?

fetchedObjectsフェッチの結果。

@property(nonatomic、readonly)NSArray * fetchedObjects説明performFetch:が呼び出されていない場合、プロパティの値はnilです。

結果の配列には、フェッチ要求(fetchRequest)で指定され、その述語に一致するエンティティのインスタンスのみが含まれます。(フェッチ要求に述語がない場合、結果の配列には、フェッチ要求で指定されたエンティティのすべてのインスタンスが含まれます。)

結果の配列は、永続ストア内の状態ではなく、コントローラーの管理対象オブジェクトコンテキスト内の管理対象オブジェクトのメモリ内の状態を反映します。ただし、返された配列は、管理対象オブジェクトが挿入、変更、または削除されても更新されません。

4

3 に答える 3

10

最後の文の意味

...ただし、管理対象オブジェクトが挿入、変更、または削除されても、返された配列は更新されません。

is(私の実験に基づく):フェッチされたオブジェクトへの参照を保存する場合

NSArray *result = [fetchedResultsController fetchedObjects];

その場合、オブジェクトが挿入、変更、または削除されても、によって参照されるこの配列は更新されません。 したがって、「返された配列は...ではないresult」ことに重点が置かれます。

しかし、あなたが呼び出す場合

[fetchedResultsController fetchedObjects]

後で再び、戻り値は変更を含むオブジェクトの新しいリストです。

より正確には、デリゲートを設定した場合、FRCは管理対象オブジェクトコンテキストへの変更を追跡し、FRCデリゲート関数を呼び出します。オブジェクトが挿入/変更/削除されたときにデリゲート関数がすぐに呼び出されるのではなく、

  • コンテキストが明示的に保存されている場合、または
  • 変更通知が実行ループで処理されるとき。

が呼び出されるとすぐcontrollerDidChangeContent:に、新しい呼び出しが[fetchedResultsController fetchedObjects]更新されたオブジェクトリストを返します。

于 2012-11-15T10:43:19.933 に答える
3

@Dwayneは[fetchedResultsController.managedObjectContext processPendingChanges]、デリゲートオブジェクトを即座に更新する場合に、挿入/削除/更新の後に使用します。通常、実行ループの最後に呼び出されます。

于 2013-08-08T10:16:24.867 に答える
1

これについても実験をしました。この呼び出しで、fetchedObjectsのカウント数が更新されたようです。

- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject
       atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type
      newIndexPath:(NSIndexPath *)newIndexPath{
}

これは、呼び出されるたびに増分動作になることを意味しますか?そしてcontrollerDidChangeContent:、すべての変更が実行されたので、が呼び出されたときにリスト全体の準備ができていますか?

@MaciekCzarnik説明ありがとうございます。ただし、毎回変更を取得できれば、[fetchedResultsController.managedObjectContext processPendingChanges]ここで呼び出す必要はありません。

可能であれば、他の人にこの行動を確認してもらえるといいのですが。

ありがとう。

于 2013-09-12T19:33:20.410 に答える