【问题标题】:Recipes to pass NSManagedObjects amongs UIViewControllers在 UIView 控制器之间传递 NSManagedObject 的方法
【发布时间】:2012-02-23 18:21:38
【问题描述】:

在一个应用程序中,可能有不同的UIViewControllers 需要共享相同的NSManagedObject。我通常会做以下事情:

@interface CustomController : UIViewController

@property (nonatomic, retain) ProductNSManagedObject* productManaged;

@end

然后,当我创建 CustomController 时,我将其注入如下:

customController.productManaged = ....

一旦完成,CustomController 负责发布它。

这种方法效果很好(我不知道它是否正确),但是当控制器需要该对象但它不是具有该对象的控制器的直接子对象时该怎么办?例如

MainController -> ChildController -> SubChildController -> ....

MainController 拥有托管对象。

我是否必须创建很多中间属性,还是需要执行新的NSFetchRequest 或其他?

同样的方面可以应用于NSManagedObjectContext。环顾四周,我发现可以从拥有它的应用程序委托中获取上下文(如果有的话)。但正如 Marcus Zarra 在 passing-around-a-nsmanagedobjectcontext-on-the-iphone 中所写,这种方法缺乏灵活性。

有什么建议吗?提前谢谢你。

【问题讨论】:

    标签: ios core-data properties nsmanagedobject nsmanagedobjectcontext


    【解决方案1】:

    我创建了一个单例对象,其中包含将在整个应用程序中使用的托管对象上下文。我将任何与数据相关的支持代码(例如,持久存储协调器)放在这个单例中,并将所有视图和控制器信息与其分开。

    在一种情况下,我需要另一个线程的托管对象上下文。很明显,重构并将该上下文放在同一个单例中会很有用。然后可以在单例内部完成两个上下文之间的合并。

    这有助于我管理我的代码。你可以考虑一下。

    【讨论】:

    • +1 为您提供建议。但是 NSManagedObject 对象呢?你知道在控制器之间传递它们的正确方法吗?谢谢。
    • 通常我为每个视图控制器使用一个获取的结果控制器。它跟踪对特定视图很重要的托管对象。获取的结果控制器通过单例绑定到托管对象上下文。这样,如果托管对象上下文通过任何视图中的操作发生变化,则绑定到其他视图的 frc 可以响应并调用它们的委托方法。
    【解决方案2】:

    这是一个非常常见的问题(相关问题请参阅herehere)。正如我在相关问题的答案中所写,您应该远离单例并创建一个单独的对象,该对象将负责对象实例化,为您的应用程序创建对象图。这个单独的对象可以保存对所有共享对象的引用并将它们提供给正在构建的对象,因此您的常规对象都不必保留对某些东西的引用,只是为了将其作为依赖项传递给其他对象。请参阅blog post 了解更多反对单例滥用的理由和进一步的指示,尤其是 Miško Hevery 的文章。

    我创建了一个sample Xcode project,它展示了如何在没有单例的情况下连接应用程序,保持低耦合并解决其他单例问题。目前很简单,后面会添加更多常见的用例。

    【讨论】:

    • 感谢您的回复和 +1 的建议。但是你的意思是 这个单独的对象可以保存对所有共享对象的引用并将它们提供给正在构建的对象,因此您的常规对象都不必保留对某些东西的引用只是为了将其作为依赖项传递给其他对象。?也许当您创建示例项目时,请告诉我。
    • 我刚看完你的回答。它们很有用。该方法似乎很干净,但我不明白的是如何引用与 Factory *factory = [[Factory alloc] init];相关的对象 factory > 在整个应用程序中。再次感谢您。
    • 您的示例项目对我来说很清楚。使用对象图的方面可以被认为是核心数据解决方案,我喜欢它。我的下一步是将您的模式应用于托管对象。你能建议我这样做的正确方法吗?例如,Factory 类会创建什么?提前谢谢你。
    • 如果我正确理解了这个问题(我不熟悉 Core Data),你的托管对象只是你需要在更多控制器之间共享的东西。在这种情况下,它类似于示例项目中的 Logger 类:Factory 应在启动时创建此对象的实例,保持对它的强引用并将实例传递给需要它的任何人。
    • 我会试试的。感谢您的支持。
    猜你喜欢
    • 2016-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-11
    • 2015-01-21
    • 1970-01-01
    相关资源
    最近更新 更多