GCD とNSOperation
基本的な議論は、優れたソリューションを提供する最高レベルの抽象化を使用するという議論に要約されます。
NSOperationQueue
は GCD の上に構築されているため、より高いレベルの抽象化である必要があります。
ただし、GCD は一般的なケースで非常に使いやすいためNSOperationQueue
、多くの場合よりも望ましいと思います。
さて、CoreData を組み合わせて使用する場合は、3 番目の代替案を提案します。iOS 5 を使用している場合は、MOC でプライベート キューの同時実行を使用できます。これは優れた抽象化であり、使いやすいインターフェイスを提供します。
したがって、NSPrivateQueueConcurrencyType
Core 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 を作成すると、このような契約に同意することになります。
抜け目のないプログラマーである私は、同時実行性に関する次のコア データ ルールに厳粛に同意します。
を使用する場合はNSConfinementConcurrencyType
、それを作成したスレッドで実行中にのみ使用します。
を使用する場合は、またはNSPrivateQueueConcurrencyType
内からのみ MOC を使用します。performBlock
performBlockAndWait
を使用する場合、 、、またはメイン スレッドで実行していることがわかっている場合にNSMainQueueConcurrencyType
のみ MOC を使用します。performBlock
performBlockAndWait
これらのルールに従えば、他のスレッドで MOC を使用できるようになります。
具体的には、 を使用するperformBlock
場合、Core Data API はコードが適切に同期されていることを確認します。