我当然读了文档,但是我没有完全理解“设置任何部分并订购内容”。
NSFetchedResultsController
除了数据库索引之外还需要其他类型的索引?NSFetchedResultsController
设置缓存时真正发生了什么?-performFetch:
,但看到时间从0.018秒(没有缓存)增加到0.023秒(带缓存)。我也计时-objectAtIndexPath:
,只有一个时间从0.000030(没有缓存)减少到0.000029(带有捕获)。换句话说,我想知道缓存何时(或没有)提高性能和原因。
正如@Marcus所指出的那样,“500个条目很小。核心数据可以处理它而没有人类明显的滞后。当你有数万条记录时使用缓存。”所以我认为很少有应用程序会从使用缓存中受益。
答案 0 :(得分:7)
NSFetchedResultsController
的缓存是一种捷径。它是NSFetchRequest
的最后结果的缓存。这不是整个数据,而是NSFetchedResultsController
足以快速显示结果的数据;很快。
它是数据库中数据的“副本”,它以NSFetchedResultsController
在下一个实例化时很容易消耗的格式序列化到磁盘。
以另一种方式来看,它是最后一个闪存冻结到磁盘的结果。
答案 1 :(得分:0)
来自NSFetchedResultsController
的{{3}}:
如果可能,控制器会使用缓存来避免重复设置 部分 和 订购所执行的工作内容
要利用缓存,您应该使用数据的分段或排序。
因此,如果在initWithFetchRequest:managedObjectContext:sectionNameKeyPath:cacheName:
中将sectionNameKeyPath
设置为nil
,您可能不会注意到任何性能提升。
答案 2 :(得分:0)
缓存控制器尽可能使用缓存来避免需要 重复在设置任何部分和订购产品时执行的工作 内容。缓存是在应用程序启动时维护的。
初始化NSFetchedResultsController的实例时, 通常指定缓存名称。 (如果您未指定缓存名称, 控制器不缓存数据。)创建控制器时,它会 查找具有给定名称的现有缓存:
如果控制器找不到合适的缓存,它将计算 必需的节以及节中对象的顺序。然后 将此信息写入磁盘。
如果找到具有相同名称的缓存,则控制器将测试该缓存 确定其内容是否仍然有效。控制器 比较当前实体名称,实体版本哈希,排序 描述符以及带有存储在缓存中的描述符的节键路径,如下 以及缓存信息文件的修改日期和 持久存储文件。
如果缓存与当前信息一致,则 控制器重新使用先前计算的信息。
如果缓存与当前信息不一致,则 重新计算所需的信息,并更新缓存。
只要该节和订购信息发生更改,高速缓存就会 已更新。
如果您有多个具有不同结果的提取结果控制器 配置(不同的排序描述符等),您必须提供 每个都有不同的缓存名称。
您可以使用deleteCache(withName :)清除缓存。