FetchResultsControllerのdelegateとcacheの意味

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にするだけで同じ結果がえられたかもしれません。