2016-07-12 2 views
0

При использовании основных данных. Я нахожу, что пишу кодappDelegate managedObjectContext spread через кодовую базу

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

// Code here 

[context save:nil]; 

всюду в кодовой базе. Это нормально или это антипаттерн? Обычно я использую только один контекст.

ответ

2

Если вы используете Core Data в нескольких местах в приложении, вы можете использовать класс Singleton, который обрабатывает основную логику основных данных и держит persistentStoreCoordinator, managedObjectModel и, конечно, хотел managedObjectContext.

@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

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 в приложении

1

Если вам не нравится шаблон singleton, вы можете передавать ссылки на свой контекст во всем приложении. Каждому из ваших контроллеров просмотров в вашем приложении нужно будет ссылаться на контекст, чтобы он мог передать его на следующий контроллер представления. Вы можете передать контекст в инициализаторе или использовать свойство.

// 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; 
}