Ios 什么';s缓存对NSFetchedResultsController的影响
我当然读了文件,但我不太明白“设置任何部分并对内容进行排序”的含义Ios 什么';s缓存对NSFetchedResultsController的影响,ios,macos,core-data,nsfetchedresultscontroller,Ios,Macos,Core Data,Nsfetchedresultscontroller,我当然读了文件,但我不太明白“设置任何部分并对内容进行排序”的含义 这些信息不是来自数据库吗 这是否意味着NSFetchedResultsController除了数据库索引之外,还需要其他类型的索引 当NSFetchedResultsController正在设置缓存时,到底发生了什么 缓存仅对静态数据有用吗?如果我的数据经常更新,我是否应该使用缓存 如何分析缓存的性能?我尝试缓存,但看不到任何性能改进。我计时了-performFetch:,但看到时间从0.018s(无缓存)增加到了0.023s(
NSFetchedResultsController
除了数据库索引之外,还需要其他类型的索引NSFetchedResultsController
正在设置缓存时,到底发生了什么-performFetch:
,但看到时间从0.018s(无缓存)增加到了0.023s(有缓存)。我还对-objectAtIndexPath:
进行了计时,只将时间从0.000030(不带缓存)减少到0.000029(带catch)正如@Marcus在下面指出的,“500个条目很小。核心数据可以在没有人为明显滞后的情况下处理这些条目。当你有成千上万条记录时,就会使用缓存。”因此,我认为很少有应用程序会从使用缓存中受益。NSFetchedResultsController的缓存是一种捷径。它是
NSFetchRequest
最后结果的缓存。它不是全部数据,而是足够的数据,以便NSFetchedResultsController
快速显示其结果;很快
它是数据库中数据的“副本”,以NSFetchedResultsController下一次实例化时易于使用的格式序列化到磁盘
从另一个角度来看,这是最后一个冻结到磁盘的结果。来自NSFetchedResultsController
:
在可能的情况下,控制器使用缓存,以避免在设置任何节和排序内容时重复执行的工作
要利用缓存,您应该使用数据的分段或排序
因此,如果在initWithFetchRequest:managedObjectContext:sectionNameKeyPath:cacheName:
中将sectionNameKeyPath设置为nil
,您可能不会注意到任何性能提升。
在可能的情况下,控制器使用缓存来避免需要
重复设置任何部分和订购部件时执行的工作
目录缓存在应用程序的启动过程中进行维护
初始化NSFetchedResultsController实例时
通常指定缓存名称。(如果未指定缓存名称,
控制器不缓存数据。)创建控制器时
查找具有给定名称的现有缓存:
如果控制器找不到合适的缓存,它将计算
所需的节和节中对象的顺序。那么
将此信息写入磁盘
如果找到同名缓存,控制器将测试该缓存
以确定其内容是否仍然有效。控制器
比较当前实体名称、实体版本哈希、排序
描述符,以及存储在缓存中的部分密钥路径,如下所示
以及缓存信息文件的修改日期和
持久存储文件
如果缓存与当前信息一致,则
控制器重用先前计算的信息
如果缓存与当前信息不一致,则
重新计算所需信息,并更新缓存
每当节和排序信息更改时,缓存都会被删除
更新
如果有多个具有不同属性的获取结果控制器
配置(不同的排序描述符等),您必须给出
每个缓存都有不同的缓存名称
您可以使用deleteCache(名称:)清除缓存
谢谢,马库斯。如果我的数据经常更新,我是否应该使用缓存?除非您经常更改谓词,否则我将使用缓存。我尝试了缓存,但没有看到任何性能改进。如何分析缓存的性能?I timed-performFetch:但是看到时间从0.018s(没有缓存)增加到0.023s(有缓存)。我还对-objectAtIndexPath:进行了计时,并且仅将时间从0.000030(不带缓存)减少到0.000029(带catch)。缓存只会在第二次启动时(第一次启动时,您正在构建缓存)提高性能。此外,只有当您在没有缓存的情况下进行提取需要花费大量的时间时,才会感受到缓存的好处。您当前的数据集太小,无法得到改进。尝试加载一个测试,加载的数据要比你期望应用程序保存的数据多一个数量级,然后观察性能。500个条目很小。核心数据可以在没有人为明显滞后的情况下处理这一问题。当您有成千上万条记录时,将使用缓存。寻找优化是在找到热点后要做的事情,否则就是白费力气。