FetchedResultsControllerは非常によく使います。
しかし、FetchedResultsControllerのプロパティであるdelegateとcacheの意味を
深く知らなかったので(毎回cacheをnilにしてたので)、ちょっと調べて見ました。

3つのパターン

delegateとcacheを設定するかしないかで3パターンあり、これによってFetchResultsControllerの挙動が変わります。

delegate cache 意味
nil nil 変化をトレースしない
fetchした時点でのデータを返す
設定する nil memoryにあるデータまではトレースする
設定する 設定する 完全にトレースする

delegateがnilの場合、リストは保持される

この3つの挙動のうち、delegateがnilの場合の”変化をトレースしない”ってのを詳しく調べてみたところ、
最初にpreFetchしたときにobjectのリストを取得し、今後は呼ばれるたびにそのリストを元にデータを返してくれるようです。

つまり、

  • performFetchで一覧に表示されるものが確定する
  • それぞれのオブジェクトのデータは、必要に応じてfetchされた時点でのもの
  • データが変化したとしても、表示は変化しない
  • memoryWorningなどで保持しているメモリ内のcacheが消えた時のみfetchしなおされるので、データが最新に更新される

というちょっとだけ不思議な状態が起きるみたいです。

前回CoreData&FetchedResultsでデータが変わっても変化しないリストを作る方法を書きましたが、もしかしたらこんな事しないでもdelegateをnilにするだけで同じ結果がえられたかもしれません。

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>