阵列过滤器与核心数据拉动性能

时间:2013-11-29 01:24:51

标签: ios objective-c uitableview core-data uisegmentedcontrol

我想知道两种不同的数据过滤方法之间的性能差异。以下是我正在使用的内容:

  • 一组核心数据对象
  • UISegmentedControl,表示布尔过滤器(学习与未学习)
  • 显示已过滤数据集的UITableView

我认为,这里有两种可能的方法:

  1. 在viewDidLoad中拉取整个核心数据集。当分段控制值发生变化时,使用谓词过滤数据数组。重新加载tableview。
  2. 最初使用谓词拉取核心数据集。当分段控制值更改时,使用更新的谓词重新拉取核心数据集。重新加载tableview。
  3. 我知道有些因素会影响答案(数据集的大小,分段控件的使用频率),我只是想知道两者之间是否存在整体最佳实践。

2 个答案:

答案 0 :(得分:2)

两种方法之间存在权衡取舍,最佳选择取决于差异对您的重要程度。对于每种情况,没有一种方法是最好的做法。

在一个阵列中预先加载所有内容可能会:

  • 启动时间较慢(因为正在进行大量提取)
  • 更高的内存使用率(因为你提取所有内容而不仅仅是一个子集)
  • 在过滤器选项之间切换时更快(因为您已有数据)

每次进行新的提取可能会:

  • 更快的启动时间
  • 降低内存使用率(因为您只拥有整个集合的子集)
  • 在过滤器选项之间切换时更慢,至少在开始时(Core Data的内部行缓存会在后续开关上加快速度)。

因素的重要程度取决于您的数据和应用。如果您有批次数据,那么内存使用可能很重要(获取实体类型的每个实例都是一种简单的方法来消耗内存使用)。速度问题取决于你的应用程序在同一时间做了什么,坦率地说,这两个选项是否足够慢以引起明显的延迟。如果您的数据集很小,那么您使用哪种方法可能没什么区别。

答案 1 :(得分:2)

我不认为会有任何用户明显的速度差异。

因此,我认为这些是最佳做法

  1. 避免过早优化。
  2. 你受记忆的限制比速度更快。
  3. 提前设计。
  4. 由此我推断出适用于当前问题的三点建议

    1. 使用最容易维护的方法。
    2. 不要从Core Data中提取超过必要的对象。
    3. 制定一些关于更新tableview中数据的策略。
    4. 要将这些要点合并到一个建议中,最好使用课程NSFetchedResultsController 在表格中显示核心数据,因为它是专门为此目的而设计的:

      1. 封装了“我正在展示的数据块”的想法。
      2. 不拉你不需要的东西,以节省你的记忆。
      3. 帮助更新tableview中的数据。
      4. 您可以通过在Xcode(4.4或更高版本)中创建基于Core Data的新项目来播放它的示例。它更接近你的第二个方法。