3

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

[[[UIApplication sharedApplication] delegate] managedObjectContext]

或者

[[[UIApplication sharedApplication] delegate] __managedObjectContext]

它不起作用。

但是这条线工作正常:

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

你有解决方案吗 ?尼尔斯

4

2 回答 2

11

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

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

视图控制器通常不应该从全局对象(例如应用程序委托)中检索上下文。这往往会使应用程序架构变得僵化。视图控制器通常也不应该为自己的使用创建上下文。这可能意味着使用控制器的上下文执行的操作没有注册到其他上下文,因此不同的视图控制器将对数据有不同的看法。

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

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

于 2011-07-08T11:57:43.657 回答
7

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

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

并添加

#import "MyAppDelegate.h"

在文件的顶部。

于 2011-07-08T09:52:09.507 回答