9

基本的に自分のアプリでは1つのモックしか使っていませんが、場合によっては複数の NSManagedObjectContext を使うべきだと思います。

  1. 複数の NSManagedObjectContext をいつ使用する必要がありますか?
  2. 場合によっては3mocを使ったほうがいいと聞いたのですが、どのような場合に3mocを使えばいいのかわからないのですが?
4

4 に答える 4

15

通常、NSManagedObjectContextCore Data db にアクセスするスレッドごとに個別の を使用します。これは、同じコンテキストへの同時書き込みが原因で、オブジェクト グラフが不整合な状態になる可能性を防ぐためです。

NSManagedObjectContextこれを処理する最も簡単な方法は、スレッドごとに新しい を作成し、単一の を共有することNSPersistentStoreCoordinatorです。

タイプの AppDelegate にプロパティを作成しNSManagedObjectContext、getter をオーバーライドして、呼び出しスレッドごとに新しいコンテキストを返します。threadDictionaryこれは、各スレッドの を利用して行います。

まず、通常どおりに managedObjectModel と persistentStoreCoordinator を設定します。次に、AppDelegate でコンテキストを作成し、プロパティに割り当てます。

self.managedObjectContext = [[NSManagedObjectContext alloc] init];
self.managedObjectContext.persistentStoreCoordinator = self.storeCoordinator;

managedObjectContext ゲッター オーバーライドで、次のコードを使用して、呼び出しスレッドごとに個別のコンテキストを返します。

- (NSManagedObjectContext *) managedObjectContext
{
    NSThread *thisThread = [NSThread currentThread];
    if (thisThread == [NSThread mainThread])
    {
        //For the Main thread just return default context iVar      
        return _managedObjectContext;
    }
    else
    {
        //Return separate MOC for each new thread        
        NSManagedObjectContext *threadManagedObjectContext = [[thisThread threadDictionary] objectForKey:@"MOC_KEY"];
        if (threadManagedObjectContext == nil)
        {
            threadManagedObjectContext = [[[NSManagedObjectContext alloc] init];
            [threadManagedObjectContext setPersistentStoreCoordinator: [self storeCoordinator]];
            [[thisThread threadDictionary] setObject:threadManagedObjectContext forKey:@"MOC_KEY"];

        }

        return threadManagedObjectContext;
    }
}

これで、AppDelegate の managedObjectContext プロパティにアクセスするコード内のどこでも、確実にスレッド セーフになります。

于 2013-07-11T14:38:15.173 に答える
2

次のリンクは、複数の管理対象オブジェクト コンテキストをいつ、なぜ、どのように使用するかを明確に説明しています。

http://www.cocoanetics.com/2012/07/multi-context-coredata/

複数の管理対象オブジェクト コンテキストを使用する 2 つの主な理由を次に示します。

  • NSManagedObjectContextはスレッドセーフではないため、スレッドNSManagedObjectContextセーフにする。
  • をロックしてNSManagedObjectContext、UI にデータを表示します。これは、UI にデータを表示し、サーバーからデータをフェッチする場合、NSManagedObjectContext並行性と UI のブロックの問題を回避するために、子でデータをフェッチする必要があることを意味します。
于 2015-06-17T07:02:36.127 に答える
0

スレッドごとに異なる「モック」を使用する

https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/CoreData/Concurrency.html

于 2013-07-11T12:41:48.127 に答える