单例 managedObjectContext

Posted

技术标签:

【中文标题】单例 managedObjectContext【英文标题】:Singleton managedObjectContext 【发布时间】:2011-07-08 09:47:11 【问题描述】:

我想使用单例 UIApplication 来访问 AppDelegate 的 managedObjectContext。但是当我写

[[[UIApplication sharedApplication] delegate] managedObjectContext]

[[[UIApplication sharedApplication] delegate] __managedObjectContext]

它不起作用。

但是这条线工作正常:

NSLog(@"Seeking for the AppDelegate : %@", [[[UIApplication sharedApplication] delegate] class]);

你有解决办法吗? 尼尔斯

【问题讨论】:

【参考方案1】:

像这样使用单例是不好的做法,甚至在 Core Data 文档中明确表示不鼓励:

http://developer.apple.com/library/ios/#documentation/DataManagement/Conceptual/CoreDataSnippets/Articles/stack.html

视图控制器通常不应该 从全局检索上下文 应用程序等对象 代表。这往往使 应用程序架构僵化。 视图控制器也不应该 通常为自己创建一个上下文 采用。这可能意味着操作 使用控制器的执行 上下文未向其他人注册 语境,如此不同的看法 控制器会有不同的 对数据的看法。

当你创建一个视图控制器时,你 给它一个上下文。你通过一个 现有的上下文,或(在某种情况下 您希望新控制器在哪里 管理一组离散的编辑)一个新的 您为其创建的上下文。它的 通常由 应用程序委托创建一个 传递给第一个视图的上下文 显示的控制器。

依赖注入(即给予视图控制器所需的东西)几乎在所有情况下都更好。在应用程序的代码中看到[[UIApplication sharedApplication] delegate] 确实不好,因为它使代码难以重用、难以编写测试等。

【讨论】:

是的,这是真的。不过,我刚刚回答了发帖者的问题;)不过,最好不要鼓励这种做法。 感谢您的建议。我会保留我的 managedObjetContext 单例。【参考方案2】:

尝试将其转换为您的实际应用委托实现,例如

 [(MyAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];

并添加

#import "MyAppDelegate.h"

在文件的顶部。

【讨论】:

你知道我们为什么要强制转换吗,因为当我测试这个类时,它和强制转换是一样的? 不是我的头顶,不。您是否在没有演员表的情况下编译它?应该是一样的,真​​的。很奇怪。 你可以在没有演员表的情况下使用它,但在这种情况下你会收到一个警告。

以上是关于单例 managedObjectContext的主要内容,如果未能解决你的问题,请参考以下文章

单例模式(单例设计模式)详解

单例模式(懒汉式单例饿汉式单例登记式单例)

单例模式

单例模式

单例模式_反射破坏单例模式_枚举类_枚举类实现单例_枚举类解决单例模式破坏

单例模式