appDelegate managedObjectContext遍布代码库

时间:2016-07-12 12:46:47

标签: ios objective-c iphone

使用核心数据时。我发现自己正在编写代码

AppDelegate *delegate = [[UIApplication sharedApplication] delegate];
NSManagedObjectContext *context = [delegate managedObjectContext];

// Code here

[context save:nil];

代码库中的任何地方。这是正常的还是反模式?我通常只使用一个上下文。

3 个答案:

答案 0 :(得分:2)

如果您在应用程序的多个位置使用Core Data,您可以使用Singleton类来处理基本的Core Data逻辑并保存persistentStoreCoordinatormanagedObjectModel,当然还有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]这一行,您可以轻松访问应用

中的共享MOC

答案 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;
}