除了从appDelegate获取它之外,如何获取viewController的managedObjectContext?

Pri*_*wal 19 core-data objective-c nsmanagedobjectcontext ios appdelegate

最近我开始知道"你真的不应该调用AppDelegate来获取托管对象上下文".苹果公司也已经把这个建议到他们的文档在这里.它是这样的:

视图控制器通常不应从全局对象(例如应用程序委托)检索上下文 - 这会使应用程序体系结构变得僵硬.视图控制器也不应为自己的用途创建上下文(除非它是嵌套的上下文).这可能意味着使用控制器上下文执行的操作未在其他上下文中注册,因此不同的视图控制器将对数据具有不同的视角.

此外,他们还提到了其他一些获取背景的方法.到目前为止,我无法弄清楚他们在那里想说些什么.任何人都可以对这个问题有所了解.任何支持语句的代码片段都是最受欢迎的.

编辑

但是,有时从应用程序或文档或视图控制器以外的其他位置检索上下文更容易或更合适.您可能在基于Core Data的应用程序中使用的几个对象保留对托管对象上下文的引用.托管对象本身具有对其自身上下文的引用,支持Core Data的各种控制器对象(如阵列和对象控制器)(OS X中的NSArrayController和NSObjectController以及iOS中的NSFetchedResultsController)也是如此.

从其中一个对象中检索上下文的优点是,如果重新构建应用程序,例如使用多个上下文,则代码可能仍然有效.例如,如果您有一个托管对象,并且想要创建与其相关的新托管对象,则可以向原始对象询问其托管对象上下文并使用该对象创建新对象.这将确保您创建的新对象与原始对象位于相同的上下文中.

究竟是什么?我确定它与下面的Highly投票答案不相似.有人可以帮我理解这部分Apple文档吗?

Mar*_*rra 39

它被称为依赖注入.基本上调用者/构造函数应该设置为被调用者/被NSManagedObjectContext构造者.

在你的AppDelegate,你应该设置NSManagedObjectContextrootViewController与该关联UIWindow.

rootViewController然后你应该NSManagedObjectContext进入下一个视图控制器,依此类推.

怎么样?它只是一个简单的视图控制器类,调用者使用:

[nextViewController setManagedObjectContext:[self managedObjectContext]];
Run Code Online (Sandbox Code Playgroud)

其他一些人可能会推荐单身,但这是另一个最好避免的深坑.

更新

依赖注入是最好的方法.

这是Apple设计的方法.另一种选择涉及某种形式的单身:AppDelegate或另一种形式.

"在控制器之间传递相同上下文的缺点是,如果在两个不同的位置修改相同的实体,则必须管理合并冲突."

这是一个完全不同的问题,并且不会用多个NSManagedObjectContext实例来解决.实际上,多个实例会使情况变得更糟并保证合并冲突.

在这种情况下,视图控制器应该监听托管对象中的更改并对它们做出反应.无法在UI中同时在两个位置更新它.用户根本无法一次关注两个地方,因此第二个位置将实时更新.

这是该问题的正确答案.

将两个实体放在同一上下文中将确保正常工作.多个上下文将导致它们在内存中具有相同数据的两个对象,并且无法在不保存到上下文的情况下注意到更改.

但是,如果您的视图控制器在没有用户干预的情况下修改数据,那么您有一个单独的问题.视图控制器供用户修改或查看数据.它们不是进行任何数据后台处理的地方.

如果您处于进口情况,那么这与您提出的问题不同.在这种情况下,您(应该)使用多个线程(UI线程,导入线程),并且每个线程必须至少有一个上下文.

在这种情况下,您确实存在合并冲突的风险,您需要为发生的情况编写代码.第一步是更改NSManagedObjectContext实例上的合并策略.

更新

我怀疑你误读了那些文档.

描述的是能够NSManagedObjectContext脱离NSManagedObject实例的能力.这绝对有用.例如,可以添加或编辑对象的视图控制器.通过推动NSManagedObject的视图控制器可以控制和决定什么视图控制器将是感人.接收视图控制器知道它需要允许编辑接收NSManagedObject.它并不关心NSManagedObjectContext它的用途.它可能与主要工作,它可能与一个孩子一起工作,它可能在单元测试中孤立,它不需要知道或关心.它只是显示来自NSManagedObject它的数据并NSManagedObjectContext在用户选择保存编辑时保存相关联的数据.

该文档并不建议您拥有一些通用的位置NSManagedObjectContext(也就是单身人士).这表明如果你有另一种方式来访问NSManagedObjectContext与之相关的NSManagedObject那种方式,那么这样做是绝对有意义的.