代码之家  ›  专栏  ›  技术社区  ›  Tim

Cocoa Touch:何时需要nsfetchedResultsController来管理核心数据获取?

  •  6
  • Tim  · 技术社区  · 16 年前

    我正在开发一个大量使用核心数据的iPhone应用程序,主要是为了它的类似数据库的功能(例如,根据提取请求设置排序顺序或谓词的能力)。我在展示各种uiTableViewControllers中获取的所有数据。

    我想知道的是,在使用nsfetchedresultsController处理请求之前,我可以提取多少对象。在核心数据文档中,它说sqlite存储将“10000个对象视为一个相当小的数据集”,但在nsfetchedresultsController的文档中,它提到一次将“数十个对象”保存在内存中。

    我主要处理的是最多50个对象的数据集,每个对象可能有12个nsnumber和nsstring实例,以及下一组对象的一对多关系(即,有20个对象A实例,每个实例与一组30个(不同)对象B实例具有一对多关系,每个实例…)。

    这个场景是否适合使用未保存的结果控制器,或者我可以通过一个简单的结果数组来摆脱它?我自己管理控制器的细节没有问题(方便方法为uiTableView索引路径获取对象,将新对象添加回上下文等),我只是想知道每个方法的内存使用情况。

    我要说的是,这款应用主要针对iPhone3G(而非S)和第一代iPod touch用户,因此请记住这些平台的内存有限。

    1 回复  |  直到 16 年前
        1
  •  11
  •   Brad Larson    16 年前

    nsfetchedResultsController是一个非常方便的助手类,用于将核心数据与UITableView交互。我的建议是将它与每个具有核心数据支持的表视图一起使用。在我使用它的每一种情况下,它都显著地减少了我必须编写的代码量。

    从性能上讲,它也可以带来巨大的改进。如果使用-setfetchbatchsize:通过将nsfetchrequest馈送到nsfetchedresultsController,则可以在只获取表视图中显示的相关数据的情况下执行批提取,而不是在整个数据集中提取。不再显示的数据也可以自动从内存中删除(我的理解也是这样)。

    对于具有中到大数据集的表,这可能导致显著的性能胜利。苹果工程师曾说过,对于一个10000个项目的数据库,这可以将启动时间减少80%以上,并将内存使用量减少50%。