Singleton managedObjectContext

Nie*_*gen 3 iphone singleton nsmanagedobjectcontext application-singleton ios

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

[[[UIApplication sharedApplication] delegate] managedObjectContext]
Run Code Online (Sandbox Code Playgroud)

要么

[[[UIApplication sharedApplication] delegate] __managedObjectContext]
Run Code Online (Sandbox Code Playgroud)

它不起作用.

但这条线很好用:

NSLog(@"Seeking for the AppDelegate : %@", [[[UIApplication sharedApplication] delegate] class]);
Run Code Online (Sandbox Code Playgroud)

你有解决方案吗 ?尼尔斯

Mik*_*ler 11

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

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

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

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

在几乎所有情况下,依赖注入(即为视图控制器提供所需的内容)都更好.[[UIApplication sharedApplication] delegate]在应用程序的代码中看到它真的不好,因为它使代码难以重用,难以编写测试等.


uve*_*ten 7

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

 [(MyAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];
Run Code Online (Sandbox Code Playgroud)

并补充说

#import "MyAppDelegate.h"
Run Code Online (Sandbox Code Playgroud)

在文件的顶部.