【问题标题】:Filtering NSFetchedResultsController at the model layer在模型层过滤 NSFetchedResultsController
【发布时间】:2015-09-22 07:15:45
【问题描述】:

我需要帮助来考虑和实施对NSFetchedResultsControllerfetchedObjects 的过滤在模型层

文档说:

响应变化

一般来说,NSFetchedResultsController 旨在响应模型层的变化,通过通知其 当结果对象更改位置或部分时委托 修改。

NSFetchedResultsController Class Reference

例如,如何在模型层实现搜索?

我想象一个Filter 实体,它与被过滤的实体有某种关联,并在NSFetchRequest 的谓词中使用。

也许我会创建一个Filter 对象,使用例如来自搜索字段的字符串对其进行配置,然后保存该对象。这将影响NSFetchRequest 的谓词,因此NSFetchedResultsController 将获取更新其fetchedObjects 的私人消息并向其代表发出消息。

我可以创建其他Filter 对象(或更改现有对象),这会进一步影响NSFetchedResultsControllerfetchedObjects,并且在删除时停止影响fetchedObjects,然后它们再次“可见”。

  • 模型在 Xcode 的模型编辑器中会是什么样子?
  • NSFetchRequest 的谓词是什么样的?
  • 这种方法有什么缺点?

【问题讨论】:

    标签: ios objective-c core-data nsfetchedresultscontroller


    【解决方案1】:

    同意韦恩的观点。模型层不是搜索时更新列表的合适机制。

    改为修改fetchRequestpredicateNSFetchedResultsController 并重新获取。这是使用UITableView 实现搜索的常见模式。

    【讨论】:

      【解决方案2】:

      这不太可能奏效。您的 fetch 将针对实体 A 并使用与实体 B 相关的谓词,该谓词包含您更新的一些配置。 FRC 仅监视实体 A 的更改,而不监视实体 B,因此当您更改配置时,它不会被拾取,因此不会触发委托。

      唯一的方法是更新谓词并重新启动 FRC。另一种方法是以某种方式将信息编码到实体 A 中,但如果你能做到这一点,你就不需要 FRC,因为在 FRC 知道之前你已经拥有所有新的搜索结果......

      【讨论】:

        【解决方案3】:

        使用这种方法,您需要为每个结果对象创建一个Filter 对象,以便NSFetchedResultsController 获取它。这些技巧可用于修改用户驱动的排序和分段,但对于过滤,您最好使用NSFetchRequest 上的谓词来过滤实际模型数据。

        除非您想进行一些仅使用原始模型数据无法完成的非常具体的过滤。在这种情况下,这将是一种替代方案,但您仍然必须为每个底层数据对象创建一个 Filter 对象。

        【讨论】:

        • 感谢 Alek 的提醒。当然,重点是 NSFetchedResultsController 的底层机制不会响应 NSFetchRequest 谓词中的更改(无需重新获取),这正是我想要实现的:在依赖已经存在的底层更改观察的同时进行过滤。
        • 好的,那么您想要更改谓词运行时并在数据集中得到更改结果的通知?
        • 是:通过 NSFetchedResultsControllerDelegate 协议获得这些更改的通知。
        猜你喜欢
        • 1970-01-01
        • 2011-06-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-07
        • 1970-01-01
        • 2013-03-10
        相关资源
        最近更新 更多