【问题标题】:Should I have a NSFetchedResultsController in every view?我应该在每个视图中都有一个 NSFetchedResultsController 吗?
【发布时间】:2011-01-14 04:46:15
【问题描述】:

我在我的第一个 iPhone 应用程序中使用 Core Data 并试图理解 NSFetchedResultsController。它在我的根视图中效果很好。我需要在每个视图控制器中实例化一个实例吗?如果是这样,是否有一个模板可以像在我的根控制器中一样简单(我只是在创建项目时选中了模板中的一个框)。当我添加一个新的视图控制器时,我看不到使用 Core Data 的选项。

更新:即使在我将代码剪切/粘贴到第二个视图之后,我还是花了一段时间才意识到在切换到新视图之前我还需要设置 managedObjectContext。在将新视图推送到导航堆栈之前,我在我的 RootViewController 中添加了以下行:

self.newVC.managedObjectContext = self.managedObjectContext;

【问题讨论】:

    标签: iphone cocoa-touch core-data


    【解决方案1】:

    如果您的其他视图正在可视化不同的实体,那么是的,您将使用不同的NSFetchedResultsController。您基本上可以从自动生成的根视图控制器中为您的其他视图控制器复制并粘贴代码......只需更改实体名称即可。

    但是,如果您的层次结构中的其他(表)视图仅显示同一实体的不同属性,则将现有的 NSFetchedResultsController 对象向下传递到层次结构会更有效/更简单。只需在类接口中创建一个NSFetchedResultsController 成员,并将其作为属性暴露在视图控制器的.h 文件中,然后合成该属性并在其.m 文件中释放。然后在将视图控制器压入堆栈之前设置属性。

    【讨论】:

    • 谢谢。我正在想象一个不同的实体。 XCode 是否采取任何措施使其更容易,还是我真的必须为每个视图剪切/粘贴该代码?我知道这没什么大不了的,但我必须从头文件中获取定义,并从 m 文件中获取实现。有点痛苦。
    • 您确实需要为每个视图进行剪切和粘贴。要么,要么创建另一个类来抽象与获取的结果控制器的交互。不过,我已经尝试过一次,如果直接处理获取的结果控制器,我会好得多。
    • 就像 kubi 说的那样,在这里抽象出一些细节可能有效也可能无效,这取决于您需要可视化的不同实体的数量。如果是 2 或 3,请复制并粘贴。如果是 10,那么抽象可能会开始节省您的时间。或者,如果这段代码以后会被更多地重用,那也建议从一开始就保持干净。在这里要务实,根据您的领域和要求进行调用,而不是严格遵守 DRY 原则。
    【解决方案2】:

    我想补充一点,如果您对同一实体使用多个 NSFetchedResultsControllers,但在不同的表中,如果您使用为同一实体插入数据,您的 UITableView 将不会更新另一个控制器。这是因为您的 UITableView 不会收到来自您尚未将自己设置为委托的 NSFetchedResultsController 的 willChangeContent 等消息。

    【讨论】:

    • 我只是被那个咬了。不确定分享它们是否真的值得 - 通常很容易制作一个新的而不必担心这样的事情。
    • @Alex Stone 你能帮我解决我目前的情况吗?
    • @Alex 你能在我目前的情况下帮助我吗?我在 ViewController 中有一个 tableView,我正在为我的应用程序中的几个模块重用 viewContoller。我重用 tableView 但 fetchController 应该是一个新的实例。当我试图实现这个应用程序崩溃时 - “内部不一致”。由于 tableView 包含由以前的 fetchresultController 填充的行,并且应该在使用新的 fetchController 实例加载数据之前删除填充的行和部分(核心数据中的数据应该保持不变并且只有 tableView 应该被刷新)。在这种情况下你能帮我吗..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-24
    • 2015-07-10
    • 1970-01-01
    • 2020-05-25
    • 2019-04-09
    • 2017-11-26
    相关资源
    最近更新 更多