8

私は CoreData に比較的慣れていないので、正しいことをしているかどうかを知りたいです。まず、ドキュメントには次のように記載されています。

「慣例により、View Controller からコンテキストを取得します。ただし、このパターンに従うには、アプリケーションを適切に実装する必要があります。

Core Data と統合するビュー コントローラーを実装する場合、NSManagedObjectContext プロパティを追加できます。

ビュー コントローラーを作成するときは、使用するコンテキストを渡します。既存のコンテキストを渡すか、(新しいコントローラーで個別の編集セットを管理する必要がある状況では) そのために作成した新しいコンテキストを渡します。通常、表示される最初のビュー コントローラーに渡すコンテキストを作成するのは、アプリケーション デリゲートの役割です

だから私がやっていることは、私の NSManagedObjectContext のプロパティを作成することです:

MyViewController.H
@interface MyViewController : ViewController
{
    NSManagedObjectContext *moc;
}

@property (nonatomic, retain) NSManagedObjectContext *moc;

@end

 MyViewController.m
 @implementation MyViewController
 @synthesize moc=moc;

1.-そして、データベースに変更を加えたい場所はいつでもこれを行います。

MainNexarAppDelegate *appDelegate =
[[UIApplication sharedApplication] delegate];

self.moc = [[NSManagedObjectContext alloc] init];
self.moc.persistentStoreCoordinator = [appDelegate persistentStoreCoordinator];
/*code**/
[self.moc save:&error];

2-.そして、別のスレッドで作業する場合は、プライベート キューで管理できるように、NSPrivateQueueConcurrencyType で NSManagedObjectContext を作成するカスタム メソッドがあります。

   //Myclass NSObject<br>

 -(NSManagedObjectContext *)createManagedObjectContext{

    MainNexarAppDelegate *appDelegate =
    [[UIApplication sharedApplication] delegate];

    NSPersistentStoreCoordinator *coordinator = [appDelegate persistentStoreCoordinator];
    if (coordinator != nil) {
        __managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];

        [__managedObjectContext setPersistentStoreCoordinator:coordinator];
    }
    return __managedObjectContext;  
}
//__managedObjectContext is my property from the .h file 
//@property (readonly,strong,nonatomic)  NSManagedObjectContext* managedObjectContext;
  1. データベースに変更を加える各View Controllerに対してNSManagedObjectContextを作成することをお勧めしますか?
    1.1。[UIApplication sharedApplication] を使用して appdelegate から永続的な NSPersistentStoreCoordinator を取得するのは有効なアプローチですか?
  2. メインスレッドと他のスレッドの間で永続ストアコーディネーターを共有しても安全ですか?

どんな助けでも大歓迎です:)。

4

5 に答える 5

3

ここでのほとんどの回答には同意しません。#1にとっては悪くありません。実際、ほとんどの場合、そうすることはおそらく良い習慣です。特に、実行中のスレッドが異なる場合。ビューコントローラーごとを含め、必要に応じていつでも NSManagedObjectContexts を作成するために、アプリが大幅に簡素化されました。これは、MagicalRecord の背後にいる人たちによっても推奨されています (ほとんどの場合、Core Data を利用するために私が使用しているものです)。NSManagedObjectContext の作成は、MR 関係者によるとオーバーヘッドの高い呼び出しではありません。私はどう考えても CoreData の専門家ではありませんが、MagicalRecord の担当者から勧められたように、この方法で行うとはるかに良い結果が得られました。

于 2013-12-20T19:32:47.303 に答える
-1

悪い例: データベースでいくつかの変更を加える予定の各ビュー コントローラーに対して NSManagedObjectContexts を作成する 良い例: 単一の NSManagedObjectContext 別名シングルトンを作成し、データベースにいくつかの変更を加えたいビュー コントローラーに渡されます。これは、アプリには基本的に単一のデータベースがありますが、1 つのアプリで複数のデータベースを使用できるためです。例 1: タブ ベースのアプリを作成したとします。この場合、ウィンドウの rootViewController は UITabBarController になり、ルートから他のすべてのコントローラーを取得できます。ここで、コンテキストを渡すことができます

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    /* 
        MUNSharedDatabaseController is the singleton
     */
    UITabBarController *tabBarController = (UITabBarController *)self.window.rootViewController;
    UIViewController *firstViewController = tabBarController.viewControllers[0];
    firstViewController.managedObjectContext = [[MUNSharedDatabaseController sharedDatabaseController] managedObjectContext];
    UIViewController *secondViewController = tabBarController.viewControllers[1];
    secondVC.managedObjectContext = [[MUNSharedDatabaseController sharedDatabaseController] managedObjectContext];
    // otherStuff, or etc.
}

また、優れた Core Data ライブラリ、別名 MagicalRecord もあります。ここで確認できます: https://github.com/magicalpanda/MagicalRecord 時間を節約したい場合は、本当に素晴らしいですが、 Core Data の代わりにはなりません。また、ここにコア データ シングルトンを作成する方法の例があります: http://steamheadstudio.pl/wordpress/core-data-singleton-with-sample-code/

于 2013-11-14T23:11:57.820 に答える