在UIViewControllers中传递NSManagedObjects的配方

时间:2012-02-23 18:21:38

标签: ios core-data properties nsmanagedobject nsmanagedobjectcontext

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

@interface CustomController : UIViewController

@property (nonatomic, retain) ProductNSManagedObject* productManaged;

@end

然后,当我进行CustomController时,我会像下面那样注入它:

customController.productManaged = ....

完成后,CustomController负责释放它。

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

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

其中MainController包含托管对象。

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

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

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

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

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

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