【问题标题】:What's the effect of cache to NSFetchedResultsController缓存到 NSFetchedResultsController 有什么作用
【发布时间】:2011-10-13 17:05:32
【问题描述】:

我当然读过文档,但我不太明白“设置任何部分并排序内容”的含义。

  1. 这些信息不是来自数据库吗?
  2. 这是否意味着NSFetchedResultsController 除了数据库索引之外还需要其他类型的索引?
  3. NSFetchedResultsController 设置缓存时到底发生了什么?
  4. 缓存是否仅对静态数据有用?如果我的数据经常更新,我应该使用缓存吗?
  5. 如何分析缓存的性能?我尝试了缓存,但看不到任何性能改进。我计时了-performFetch:,但看到时间从 0.018 秒(无缓存)增加到 0.023 秒(有缓存)。我还计时了-objectAtIndexPath:,仅时间从 0.000030(无缓存)减少到 0.000029(有捕获)。

换句话说,我想知道缓存何时(或不)提高性能以及为什么。

正如@Marcus 在下面指出的那样,“500 个条目很小。Core Data 可以在没有人为明显滞后的情况下处理它。当您拥有数万条记录时,就会使用缓存。”所以我认为很少有应用程序会从使用缓存中受益。

【问题讨论】:

    标签: ios macos core-data nsfetchedresultscontroller


    【解决方案1】:

    NSFetchedResultsController 的缓存是一种捷径。它是来自NSFetchRequest 的最后结果的缓存。 NSFetchedResultsController 快速显示结果的不是全部数据,而是足够的数据;很快。

    它是数据库中数据的“副本”,以NSFetchedResultsController 在下一次实例化时易于使用的格式序列化到磁盘。

    换个角度看,它是最后一个结果闪存冻结到磁盘。

    【讨论】:

    • 谢谢,@Marcus。如果我的数据经常更新,我应该使用缓存吗?
    • 除非您要经常更改谓词,否则我会使用缓存。
    • 我试过缓存,但看不到任何性能提升。如何分析缓存的性能?我计时了 -performFetch: 但看到时间从 0.018 秒(无缓存)增加到 0.023 秒(有缓存)。我还计时了 -objectAtIndexPath: 时间从 0.000030(无缓存)到 0.000029(有捕获)。
    • 缓存只会在第二次启动时提高性能(第一次启动时您正在构建缓存)。此外,只有在没有它的情况下获取需要花费大量时间的情况下,才会感受到缓存的好处。您当前的数据集太小,无法得到改进。尝试加载一个数量级的测试数据,然后再观察应用程序的性能。
    • 500 个条目很小。 Core Data 可以在没有人为延迟的情况下处理这个问题。当您有 数万 条记录时使用缓存。寻找优化是您在找到热点之后才做的事情,否则就是白费力气。
    【解决方案2】:

    来自NSFetchedResultsControllerdocumentation

    在可能的情况下,控制器使用缓存来避免在设置任何部分排序时重复执行的工作 内容

    要利用缓存,您应该对数据进行分段或排序。

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

    【讨论】:

      【解决方案3】:

      From the documentation

      缓存 在可能的情况下,控制器使用缓存来避免需要 重复在设置任何部分和订购 内容。缓存在您的应用程序启动期间得到维护。

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

      如果控制器找不到合适的缓存,它会计算 所需的部分和部分内对象的顺序。那么它 将此信息写入磁盘。

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

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

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

      任何时候节和排序信息发生变化,缓存都是 更新了。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-06
        • 1970-01-01
        • 1970-01-01
        • 2011-04-13
        • 1970-01-01
        • 2012-03-01
        相关资源
        最近更新 更多