在模型层

时间:2015-09-22 07:15:46

标签: ios objective-c core-data nsfetchedresultscontroller

我需要帮助来思考并实施模拟NSFetchedResultsController fetchedObjects 在模型层的过滤。

文档说:

  

响应变更

     

通常,NSFetchedResultsController旨在通过通知它来响应模型层的更改   当结果对象更改位置或部分时,委托   修改。

     

NSFetchedResultsController Class Reference

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

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

也许我会创建一个Filter对象,用搜索字段中的字符串配置它,然后保存该对象。这会影响NSFetchRequest的谓词,因此NSFetchedResultsController会获取私有消息以更新其fetchedObjects并向其代理发出消息。

我可以创建其他Filter个对象(或更改现有对象),这些对象会进一步影响NSFetchedResultsController的{​​{1}},并且在删除后会停止影响fetchedObjects,然后再“可见”。

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

3 个答案:

答案 0 :(得分:0)

这不太可行。您的提取将指向实体A并使用与实体B相关的谓词,该实体包含您更新的某些配置。 FRC仅监控实体A的更改,而不是实体B的更改,因此当您更改配置时,它将不会被选中,因此不会触发代理。

执行此操作的唯一方法是更新谓词并重新启动FRC。替代方法是以某种方式将信息编码为实体A,但如果你能做到这一点,你就不需要FRC了,因为你已经拥有了所有新的搜索结果,而FRC就知道了...

答案 1 :(得分:0)

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

相反,修改fetchRequest的{​​{1}}的{​​{1}}并重新获取。这是使用NSFetchedResultsController实现搜索的常见模式。

答案 2 :(得分:0)

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

除非您想要进行一些非常具体的过滤,否则只能使用原始模型数据。在这种情况下,它将是一种替代方案,但您仍然需要为每个基础数据对象创建一个Filter对象。