使用核心数据时。我发现自己正在编写代码
AppDelegate *delegate = [[UIApplication sharedApplication] delegate];
NSManagedObjectContext *context = [delegate managedObjectContext];
// Code here
[context save:nil];
代码库中的任何地方。这是正常的还是反模式?我通常只使用一个上下文。
答案 0 :(得分:2)
如果您在应用程序的多个位置使用Core Data,您可以使用Singleton类来处理基本的Core Data逻辑并保存persistentStoreCoordinator
,managedObjectModel
,当然还有managedObjectContext
1}}。
@interface DataManager : NSObject
@property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext;
@property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel;
@property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;
+ (DataManager *)sharedManager;
- (void)saveContext;
@end
然后您可以在任何地方使用上下文
#import "DataManager.h"
...
NSManagedObjectContext *managedObjectContext = [[DataManager sharedManager] managedObjectContext];
// Do some Core Data action
我不建议在AppDelegate上添加属性,因为AppDelegate用于处理应用程序事件,而不是存储数据。它只是更干净。顺便说一句..我总是试着遵循“单一责任原则”(https://en.wikipedia.org/wiki/Single_responsibility_principle)
答案 1 :(得分:1)
AppDelegate.h
+(AppDelegate *)sharedManager;
AppDelegate.m
+(AppDelegate *)sharedManager
{
static AppDelegate *sharedMyManager = nil;
@synchronized(self)
{
if (sharedMyManager == nil)
{
sharedMyManager = (AppDelegate *)[[UIApplication sharedApplication] delegate];
}
}
return sharedMyManager;
}
因此,使用[[AppDelegate sharedManager] managedObjectContext]
这一行,您可以轻松访问应用
答案 2 :(得分:1)
如果你不喜欢单身模式,你可以在整个应用程序中传递对你的上下文的引用。应用程序中的每个视图控制器都需要保留对上下文的引用,以便它可以将其传递给下一个视图控制器。您可以在初始化程序中传递上下文或使用属性。
// Example class interface. All of your view controllers would look like this.
// You could put this stuff in a protocol as well.
@interface ViewController : UIViewController
{
@property (nonatomic, strong) NSManagedObjectContext *context
// or
- (instancetype)initWithContext:(NSManagedObjectContext *)context;
}
当您的应用程序开始时,您需要加载NSManagedObjectContext
并将其传递给屏幕上显示的任何视图控制器,方法是初始化它们或在prepareForSegue
中。如果您通过代码启动应用,则可以在AppDelegate
中初始化此内容,也可以将其加载到初始视图控制器的viewDidLoad
中。以下是AppDelegate
中的示例。
- application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
NSManagedObjectContext *context = // get your context
// initialize your view controller or get it from the storyboard or put this code where ever your app starts
ViewController *viewController = [[ViewController alloc] initWithContext:context];
// or pass the context as a property
ViewController *viewController = [[ViewController alloc] init];
viewController.context = context;
window.rootViewController = viewController;
[window makeKeyAndVisible];
return YES;
}