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个条目很小。核心数据可以在没有人为明显滞后的情况下处理这一问题。当您有成千上万条记录时,将使用缓存。寻找优化是在找到热点后要做的事情,否则就是白费力气。