1

Core Dataでは、スレッドセーフの問題を常に回避しています。2つの異なるスレッドの1つでフェッチを実行NSManagedObjectContextすると、デッドロックが保証されます。AppleのCoreDataプログラミングガイドでは、スレッドの制限を使用することを提案していますが、これを実現するためのパターンは提供されていません。私は以下の迅速で汚い解決策を持っています:

- (NSManagedObjectContext *) managedObjectContext
{
    NSManagedObjectContext *moc = objc_getAssociatedObject([NSThread currentThread], _cmd);

    if (!moc && self.persistentStoreCoordinator)
    {
        moc = [[NSManagedObjectContext alloc] init];
        moc.mergePolicy = NSOverwriteMergePolicy;
        moc.persistentStoreCoordinator = self.persistentStoreCoordinator;
        objc_setAssociatedObject([NSThread currentThread], _cmd, moc, OBJC_ASSOCIATION_RETAIN);
    }

    return moc;
}

このメソッドは、アプリのデータスタックを管理する独自のクラスに表示されます。MOCを現在のスレッドに関連付けます。これは私にはもっともらしい解決策のように思えますが、速くて緩いようにも見えます。

このような解決策を試みることについて何を心配する必要がありますか?

4

1 に答える 1

1

あなたは逆に行くべきです:使用する

[NSManagedObjectContext alloc] initWithConcurrencyType:concurrencyType]]

のコンテキストを作成するには

  • NSMainQueueConcurrencyType-メインスレッドでのみ使用する必要があるコントローラーとUIオブジェクトにリンクされたコンテキストが必要な場合、または
  • NSPrivateQueueConcurrencyType-プライベートバックグラウンドキューで実行されるコンテキストの場合。

performBlockコンテキストでのまたはすべての操作に使用performBlockAndWaitします。これにより、コンテキストに指定されたキューで操作が確実に実行されます。

詳細については、「OSXv10.7およびiOS5.0のコアデータリリースノート」の管理対象オブジェクトコンテキストの同時実行サポートを参照してください。

于 2013-03-08T18:29:07.920 に答える