被称为依赖注入。基本上,调用者/构造函数应该将
NSManagedObjectContext
设置到被调用/构造的对象中。
在你的
AppDelegate
中,应该将
NSManagedObjectContext
设置到与
UIWindow
相关联的
rootViewController
中。
然后,你的
rootViewController
应该将
NSManagedObjectContext
设置到下一个视图控制器中,以此类推。
如何实现呢?只需要在视图控制器类中进行简单的属性声明,然后调用方使用即可。
[nextViewController setManagedObjectContext:[self managedObjectContext]]
有些人可能会建议使用单例,但那是另一个最好避免的深坑。
更新
依赖注入是最佳方法。
这是苹果设计的方法。另一种选择涉及某种形式的单例:AppDelegate或另一个单例。
“在控制器之间传递相同的上下文的缺点是,如果在两个不同的位置修改同一实体,则必须管理合并冲突。”
这是完全不同的问题,它不会通过使用多个NSManagedObjectContext
实例来解决。事实上,多个实例会使情况变得更糟,并确保出现合并冲突。
在那种情况下,您的视图控制器应该监听托管对象中的更改并对其做出反应。使其无法同时在UI中的两个位置更新。用户无法同时关注两个位置,因此第二个位置将实时更新。
那就是该问题的正确答案。
将两个实体都放入同一个上下文中将确保其正常工作。多个上下文会导致内存中有两个具有相同数据的对象,而没有办法在不保存到上下文的情况下注意到更改。
但是,如果您有视图控制器在没有用户干预的情况下修改数据,则存在单独的问题。视图控制器用于用户修改或查看数据。它们不是任何类型的后台数据处理的地方。
如果在导入情况下,则与您提问的问题不同。在这种情况下,您(应该)使用多个线程(UI线程,导入线程),并且您必须每个线程至少拥有一个上下文。
在这种情况下,您确实面临合并冲突的风险,并且需要针对发生的情况进行编码。第一步是更改NSManagedObjectContext
实例的合并策略。
更新
我怀疑您误读了那份文档。
那是在描述从NSManagedObject
实例中获取NSManagedObjectContext
的能力。这是绝对有用的。例如,考虑具有添加或编辑对象功能的视图控制器。通过仅推送NSManagedObject
到视图控制器,您可以控制并决定该视图控制器将要操作的内容。接收视图控制器知道它需要允许对接收到的NSManagedObject
进行编辑。它不关心它正在使用哪个NSManagedObjectContext
。它可以使用主要的,也可以使用子类,也可以在单元测试中隔离,它不需要知道或关心。它只是显示从手头得到的NSManagedObject
的数据,并在用户选择保存编辑时保存相关的NSManagedObjectContext
。
该文档并没有建议为您的NSManagedObjectContext
创建某个通用位置(即单例)。它建议如果您有另一种访问与NSManagedObject
关联的NSManagedObjectContext
的方法,则这样做是可以的,并且绝对有意义。