以老式的方式提供UITableView核心数据

时间:2012-06-12 15:20:08

标签: core-data uitableview nsfetchedresultscontroller

有没有人有一个例子,说明如何有效地为UITableView提供来自Core Data模型的数据,最好包括使用部分(通过引用的属性),不带使用NSFetchedResultsController?

在NSFetchedResultsController可用之前,这是如何完成的?理想情况下,样本应该只获取正在查看的数据,并在必要时发出额外请求。

谢谢,

1 个答案:

答案 0 :(得分:0)

为了记录,我同意CommaToast的说法,实现NSFetchedResultsController的替代版本充其量只有一些非常有限的理由。事实上,当我提倡这样做时,我无法想到这个场合。

话虽如此,出于教育的目的,我想:

  • 创建时,NSFetchedResultsController针对托管对象上下文运行相关的NSFetchRequest以创建初始结果集;
  • 随后 - 如果它有委托 - 它从托管对象上下文中侦听NSManagedObjectContextObjectsDidChangeNotification。收到该通知后,它会更新其结果集。

获取请求位于谓词上方,并且谓词不能总是分解为它们引用的键(例如,如果您通过predicateWithBlock:创建一个)。此外,虽然插入和删除的列表非常明确,但更改的对象列表并未提供有关这些对象如何更改的线索。所以我想它只是重新运行获取请求中提供的谓词对照已更改和插入记录的组合集,然后适当地累积结果,从之前认为结果的已删除集中删除任何内容。

在处理具有提取限制的提取请求时,可能会执行更有效的操作。明显的观察,直接在我的头顶:

  • 如果你已经有足够的对象,那些没有被删除或修改过,并且新插入或修改过的对象都没有比你拥有的对象更高的排序位置,那么显然没有任何变化要传播,你不需要运行新查询;
  • 即使你丢失了一些你拥有的物体,如果你保留了最低的物体,那么你就有了一个没有改变的物体的上限,所以如果改变和插入的物体与你已经改变的物体一起已经做得更多,那么你也可以避免新的查询。

逻辑扩展似乎是只有当你出现删除,插入和更改修改排序列表的位置时才需要重新询问托管对象上下文,以便 - 在将其删除到给定列表之前获取限制 - 底部对象不是您上次使用的对象。原因是你不知道任何关于你没有的插入和修改的存储对象;你只知道那些与你以前没有比较的东西。