单例 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的主要内容,如果未能解决你的问题,请参考以下文章