【发布时间】:2014-01-29 18:51:29
【问题描述】:
最近我开始知道“你真的不应该调用 AppDelegate 来获取托管对象上下文”。 Apple 还将此建议写入其文档here。 它是这样的:
视图控制器通常不应该从全局对象(例如应用程序委托)中检索上下文——这使得应用程序架构变得僵化。视图控制器也不应该为自己的使用创建上下文(除非它是嵌套上下文)。这可能意味着使用控制器的上下文执行的操作没有注册到其他上下文,因此不同的视图控制器对数据有不同的看法。
他们还提到了其他一些获取上下文的方法。到目前为止,我无法弄清楚他们想在那里说什么。任何人都可以对这个问题有所了解。任何代码 sn-p 支持语句都将受到欢迎。
编辑
不过,有时检索 来自应用程序或文档之外的某个地方的上下文,或者 视图控制器。您可能会在基于核心数据的项目中使用的几个对象 应用程序保留对托管对象上下文的引用。托管 对象本身具有对其自身上下文的引用,各种 支持 Core Data 的控制器对象,例如数组和对象 控制器(OS X 中的 NSArrayController 和 NSObjectController,以及 iOS 中的 NSFetchedResultsController)。
从这些对象之一中检索上下文具有优势 如果你重新设计你的应用程序,例如使用 多个上下文,您的代码可能仍然有效。例如, 如果您有一个托管对象,并且您想创建一个新的托管对象 与它相关的对象,您可以向原始对象询问其 托管对象上下文并使用它创建新对象。这会 确保您创建的新对象与 原创。
究竟是什么?确信它与下面高度投票的答案不相似。有人可以帮我理解这部分 Apple 文档吗?
【问题讨论】:
-
绝对不要使用应用代理。如果您必须使用全局对象,请将其放在一个单例中,其名称反映了它包含该数据库。
-
@uliwitness 我很想知道,为什么不 appDelegate 以及为什么另一个单身人士可以?
-
因为应用委托被命名为“应用委托”。它旨在执行与整个应用程序有关的事情以及如何从外部感知它(停靠菜单、打开文件等)。它是特定于这一应用程序的代码,并且设计上不可重用。其他单例独立于这个特定的应用程序。此外,您的单身人士有一个更精确的名称。如果你把这样的东西放在应用程序委托中,它会收集废话,因为单例的所有东西都是“用于整个应用程序”的。
-
不建议使用应用代理可能是因为如果您需要引入新的 MOC,那么设置允许更多“模块化”代码。它更多地抱怨 OO 架构。
-
"在控制器之间传递相同上下文的缺点是,如果同一个实体在两个不同的地方被修改,您必须管理合并冲突。"在 iOS 中通常不是问题,因为您通常一次只能看到一个视图控制器
标签: ios objective-c core-data nsmanagedobjectcontext appdelegate