1

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

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

谢谢,

蒂姆

4

1 回答 1

0

作为记录,我同意 CommaToast 的观点,即实施替代版本的NSFetchedResultsController. 事实上,我想不出我会提倡这样做的场合。

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

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

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

每当处理具有获取限制的获取请求时,您可能可以做更有效的事情。明显的观察结果,直接从我的脑海中浮现:

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

逻辑扩展似乎是,只有当您出现在删除、插入和更改修改您的排序列表的位置时,您才需要重新询问托管对象上下文,以便 - 在将其削减到给定的获取限制之前 -底部的对象不是您上次拥有的对象。原因是您对未持有的存储对象与插入和修改一无所知;你只知道那些你没有持有的人与你以前拥有的人相比如何。

于 2012-07-20T02:09:30.563 回答