缓存对NSFetchedResultsController的影响是什么

时间:2011-10-13 17:05:32

标签: ios macos core-data nsfetchedresultscontroller

我当然读了文档,但是我没有完全理解“设置任何部分并订购内容”。

  1. 这些信息不是来自数据库吗?
  2. 这是否意味着NSFetchedResultsController除了数据库索引之外还需要其他类型的索引?
  3. NSFetchedResultsController设置缓存时真正发生了什么?
  4. 缓存是否仅对静态数据有用?如果我的数据经常更新,我应该使用缓存吗?
  5. 如何分析缓存的性能?我试过缓存,但看不到任何性能提升。我定时-performFetch:,但看到时间从0.018秒(没有缓存)增加到0.023秒(带缓存)。我也计时-objectAtIndexPath:,只有一个时间从0.000030(没有缓存)减少到0.000029(带有捕获)。
  6. 换句话说,我想知道缓存何时(或没有)提高性能和原因。

    正如@Marcus所指出的那样,“500个条目很小。核心数据可以处理它而没有人类明显的滞后。当你有数万条记录时使用缓存。”所以我认为很少有应用程序会从使用缓存中受益。

3 个答案:

答案 0 :(得分:7)

NSFetchedResultsController的缓存是一种捷径。它是NSFetchRequest的最后结果的缓存。这不是整个数据,而是NSFetchedResultsController足以快速显示结果的数据;很快。

它是数据库中数据的“副本”,它以NSFetchedResultsController在下一个实例化时很容易消耗的格式序列化到磁盘。

以另一种方式来看,它是最后一个闪存冻结到磁盘的结果。

答案 1 :(得分:0)

来自NSFetchedResultsController的{​​{3}}:

  

如果可能,控制器会使用缓存来避免重复设置 部分 订购所执行的工作内容

要利用缓存,您应该使用数据的分段或排序。

因此,如果在initWithFetchRequest:managedObjectContext:sectionNameKeyPath:cacheName:中将sectionNameKeyPath设置为nil,您可能不会注意到任何性能提升。

答案 2 :(得分:0)

From the documentation

  

缓存控制器尽可能使用缓存来避免需要   重复在设置任何部分和订购产品时执行的工作   内容。缓存是在应用程序启动时维护的。

     

初始化NSFetchedResultsController的实例时,   通常指定缓存名称。 (如果您未指定缓存名称,   控制器不缓存数据。)创建控制器时,它会   查找具有给定名称的现有缓存:

     

如果控制器找不到合适的缓存,它将计算   必需的节以及节中对象的顺序。然后   将此信息写入磁盘。

     

如果找到具有相同名称的缓存,则控制器将测试该缓存   确定其内容是否仍然有效。控制器   比较当前实体名称,实体版本哈希,排序   描述符以及带有存储在缓存中的描述符的节键路径,如下   以及缓存信息文件的修改日期和   持久存储文件。

     

如果缓存与当前信息一致,则   控制器重新使用先前计算的信息。

     

如果缓存与当前信息不一致,则   重新计算所需的信息,并更新缓存。

     

只要该节和订购信息发生更改,高速缓存就会   已更新。

     

如果您有多个具有不同结果的提取结果控制器   配置(不同的排序描述符等),您必须提供   每个都有不同的缓存名称。

     

您可以使用deleteCache(withName :)清除缓存。