CoreDataによる並列処理
注意点
基本的に以下の2点に注意する必要がある。
-
NSManagedObjectContext
はスレッドセーフではない -
NSManagedObject
はスレッドセーフではない
ベストプラクティス
-
NSManagedObjectContext
はスレッド(キュー)を指定して生成する。
// メインスレッド用のNSManagedObjectContext
NSManagedObjectContext *moc = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
// バッググラウンドスレッド用のNSManagedObjectContext
NSManagedObjectContext *moc = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
-
NSManagedObjectContext
及びNSManagedObject
の利用はperformBlock:
又はperformBlockAndWait:
のブロック内部で行う。
// 非同期で処理を行う
[moc performBlock:^{
// 非同期処理
[moc save:nil];
}];
// 同期で処理を行う
[moc performBlockAndWait:^{
// 同期処理
[moc save:nil];
}];
-
NSManagedObjectContext
を親子関係で利用する。
*公式ドキュメントであるCore Dataプログラミングガイド - Apple DeveloperのCore Dataによる並列処理
を確認すると先頭に以下のように書いてあって参考にならない。
Important: Core Dataによる並列処理のべストフラクティスは、この資料を執筆した当時から大き く変わりました。現在てはこの章の内容を推奨していませんので注意してくたさい。
デバッグ(←これが重要)
Xcodeの起動時引数に-com.apple.CoreData.ConcurrencyDebug 1
を指定して起動すると並列処理違反時に例外が発生して教えてくれる。