5

データをあるスレッドの Core-Data に保存し、別のスレッドの Core-Data から読み取る必要がある状況に適しているのはどれですか?

私は GCD を考えていましたが、スレッドごとに NSManagedObjectContext を作成するとどのように機能しますか? これらのオブジェクトをキューに作成するにはどうすればよいでしょうか?

さまざまなスレッドで変更が行われたときに、データ ストアを更新/同期する必要があります。これは、GCD または NSOperation で行う方がよいですか?

ストアの破損や異なるバージョンのストアの問題が発生することなく、必要に応じてデータストアの読み取りと書き込みを行うときに、ブロックを 2 つのキューに渡すことができるようにしたいと考えています。

4

2 に答える 2

16

GCD とNSOperation基本的な議論は、優れたソリューションを提供する最高レベルの抽象化を使用するという議論に要約されます。

NSOperationQueueは GCD の上に構築されているため、より高いレベルの抽象化である必要があります。

ただし、GCD は一般的なケースで非常に使いやすいためNSOperationQueue、多くの場合よりも望ましいと思います。

さて、CoreData を組み合わせて使用​​する場合は、3 番目の代替案を提案します。iOS 5 を使用している場合は、MOC でプライベート キューの同時実行を使用できます。これは優れた抽象化であり、使いやすいインターフェイスを提供します。

したがって、NSPrivateQueueConcurrencyTypeCore Data を実行するスレッドごとに MOC を作成することをお勧めします。アプリケーションの特性に基づいて、 を共有するかpersistentStoreCoordinator、別のものを使用するかを選択できます。ネストされたコンテキストを使用することもできます (挿入側に注意してください)。

基本的に、それはこのモデルに従います...

NSManagedObjectContext *moc = [[NSManagedObjectCotext alloc] initWithConcurrencyType:NSPrivateQueuqConcurrencyType];
moc.parentContext = contextIWantToBeParent;
moc.persistentStoreCoordinator = pscIWant;

[moc performBlock:^{
    // Your MOC stuff running on its own private queue
}];

もちろん、いずれかの方法を選択する必要があります (既存の MOC にペアレント化するか、PSC にアタッチするかのいずれか)。

私は一般的に方法を好みperformBlockます。

編集

ありがとう。NSManagedObject はスレッドセーフではないことを読みました。そのプライベート キューに新しい NSManagedObjects を作成するにはどうすればよいですか? – ヘリウム3

はい、それは本当です。ただし、同時実行タイプで MOC を作成すると、このような契約に同意することになります。

抜け目のないプログラマーである私は、同時実行性に関する次のコア データ ルールに厳粛に同意します。

  1. を使用する場合はNSConfinementConcurrencyType、それを作成したスレッドで実行中にのみ使用します。

  2. を使用する場合は、またはNSPrivateQueueConcurrencyType内からのみ MOC を使用します。performBlockperformBlockAndWait

  3. を使用する場合、 、、またはメイン スレッドで実行していることがわかっている場合にNSMainQueueConcurrencyTypeのみ MOC を使用します。performBlockperformBlockAndWait

これらのルールに従えば、他のスレッドで MOC を使用できるようになります。

具体的には、 を使用するperformBlock場合、Core Data API はコードが適切に同期されていることを確認します。

于 2012-08-25T23:03:53.313 に答える
1

iOS 5 の新しいコンテキスト同時実行タイプにより、すべての問題が解決され、さらに多くの問題が解決されました。

http://developer.apple.com/library/mac/#releasenotes/DataManagement/RN-CoreData/_index.html

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

于 2012-08-25T23:03:23.873 に答える