iOS
CoreData

CoreDataによる並列処理

More than 1 year has passed since last update.

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を親子関係で利用する。

Multi-Context CoreData

*公式ドキュメントであるCore Dataプログラミングガイド - Apple DeveloperCore Dataによる並列処理を確認すると先頭に以下のように書いてあって参考にならない。

Important: Core Dataによる並列処理のべストフラクティスは、この資料を執筆した当時から大き く変わりました。現在てはこの章の内容を推奨していませんので注意してくたさい。

デバッグ(←これが重要)

Xcodeの起動時引数に-com.apple.CoreData.ConcurrencyDebug 1を指定して起動すると並列処理違反時に例外が発生して教えてくれる。

coredata_debug.png

詳細はCore Data Concurrency Debugging