2016-07-12 5 views
0

コアデータを使用する場合。私は自分自身がコードを書いていることを知っています。appDelegate managedObjectContextがコードベースで広がっています

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

// Code here 

[context save:nil]; 

どこでもコードベースにあります。これは正常ですか、これは反パターンですか?私はたいてい一つの文脈しか使わない。

答えて

2

アプリのいくつかの場所でコアデータを使用している場合は、基本コアデータロジックを処理し、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

シングルトンパターンが気に入らない場合は、アプリ全体であなたのコンテキストへの参照を渡すことができます。あなたのアプリケーション内のすべてのビューコントローラは、次のビューコントローラに渡すことができるように、コンテキストへの参照を保持する必要があります。初期化子でコンテキストを渡すことも、プロパティを使用することもできます。

// 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; 
} 
関連する問題