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