3

在一个应用程序中,可能有不同的UIViewController需要共享相同的NSManagedObject。我通常做到以下几点:在UIViewControllers中传递NSManagedObjects的食谱

@interface CustomController : UIViewController 

@property (nonatomic, retain) ProductNSManagedObject* productManaged; 

@end 

后来,当我istantiate CustomController我把它注射类似如下:

customController.productManaged = .... 

做一次,CustomController负责将其释放。

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

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

其中MainController有管理的对象。

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

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

有什么建议吗?先谢谢你。

回答

1

这是一个非常常见的问题(有关的问题见herehere)。正如我在相关问题的答案中所写的,您应该远离单例,并创建一个独立的对象来处理对象实例化,并为您的应用程序创建对象图。这个单独的对象可以持有对所有共享对象的引用,并将它们提供给正在构建的对象,以便您的任何常规对象都不必保留引用,只是将它作为依赖项传递给其他对象。请参阅此blog post以获取更多关于防止单身人士滥用和进一步提示的理由,特别是MiškoHevery的文章。

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

+0

感谢您的回复,并为您的建议+1。但是你的意思是什么*这个独立的对象可以持有对所有共享对象的引用,并将它们提供给正在构建的对象,这样你的任何常规对象都不得不保留对某些东西的引用,只是将它作为依赖项传递给其他对象。*?也许当你创建你的示例项目时,让我知道。 – 2012-02-24 08:41:43

+0

我刚读完你的答案。它们很有用。该方法似乎非常干净,但我不明白的是如何引用与* Factory * factory = [[Factory alloc] init] *在整个应用程序中连接的对象*工厂*。再次感谢你。 – 2012-02-24 08:48:06

+0

查看编辑,示例项目应该清楚。 – zoul 2012-02-24 08:56:19

2

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

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

这帮助我管理我的代码。你可能会考虑它。

+0

+1您的建议。但是** NSManagedObject **对象呢?你知道在控制器之间传递它们的正确方法吗?谢谢。 – 2012-02-23 20:13:18

+0

您是否访问该单例中的托管对象? – 2012-02-23 20:19:23

+1

通常我为每个视图控制器使用一个抓取的结果控制器。它跟踪对特定视图很重要的被管理对象。获取的结果控制器通过单例绑定到托管对象上下文。这样,如果托管对象上下文通过任何视图中的操作进行更改,则绑定到其他视图的frc可以响应并调用其委托方法。 – Jim 2012-02-23 20:32:39