在UIViewControllers之间传递NSManagedObjects的方法

3

在应用程序中,可能会存在需要共享同一个NSManagedObject的不同UIViewController。 我通常会采取以下方式:

@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 中所写的那样,这种方法缺乏灵活性。

有什么建议吗?提前感谢您。

2个回答

2
我创建了一个单例对象,其中包含将在整个应用程序中使用的托管对象上下文。我将与数据相关的任何支持代码(例如,持久化存储协调器)放置在此单例内,并将所有视图和控制器信息与其分开。
在某些情况下,我需要为另一个线程创建托管对象上下文。显然,将该上下文放入同一单例对象中会很有用。然后,可以在单例对象内部进行两个上下文之间的合并。
这有助于管理我的代码。您可能也要考虑这种方法。

谢谢你的建议。但是关于NSManagedObject对象呢?你知道在控制器之间传递它们的正确方法吗?谢谢。 - Lorenzo B
1
通常我为每个视图控制器使用一个获取结果控制器。它跟踪对该特定视图很重要的托管对象。获取结果控制器通过单例绑定到托管对象上下文。这样,如果在任何视图中通过操作更改了托管对象上下文,则绑定到其他视图的frc可以响应并调用其委托方法。 - Jim

1

这是一个非常常见的问题(参见此处此处以获取相关信息)。正如我在相关问题的答案中所写,您应该远离单例,并创建一个单独的对象来负责应用程序的对象实例化和创建对象图。这个单独的对象可以持有所有共享对象的引用并将它们提供给正在构建的对象,以便您的常规对象不必保留对某些东西的引用,仅仅是为了将其作为依赖项传递给其他对象。请参见博客文章以获取更多反对单例模式误用的理由和进一步指针,特别是Miško Hevery的文章。

我创建了一个示例 Xcode 项目,展示了如何在不使用单例的情况下连接应用程序,保持耦合度低并解决其他单例问题。目前非常简单,稍后我会添加更多常见用例。


感谢您的回复和对您建议的支持。但是,您所说的“这个单独的对象可以保存所有共享对象的引用并将它们提供给正在构建的对象,以便您的常规对象不必保留对某些东西的引用,只需将其作为依赖项传递给其他对象。”是什么意思?也许当您创建示例项目时,请告诉我。 - Lorenzo B
我刚刚读完了你的回答,它们很有用。这种方法似乎非常干净,但我不明白如何在整个应用程序中引用使用 *Factory factory = [[Factory alloc] init]; 实例化的对象 factory。再次感谢。 - Lorenzo B
我已经清楚地了解了你的示例项目。使用对象图来处理工作方面可以被视为核心数据解决方案,我很喜欢它。我的下一步是将你的模式应用于托管对象。你能否建议我正确的做法?例如,Factory类会创建什么?非常感谢。 - Lorenzo B
1
如果我理解问题正确的话(我不熟悉Core Data),你的托管对象只是你需要在更多控制器之间共享的东西。在这种情况下,就像示例项目中的Logger类一样:当Factory启动时应该创建此对象的实例,保持对其的强引用并将实例传递给需要它的人。 - zoul

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接