NSManagedObjectContextの基本

CoreDataを操作する際にはNSManagedObjectNSManagedObjectContextを利用します。

この2つは、次のような関係にあります。

  • NSManagedObject: 操作対象のレコードを表すオブジェクト
  • NSManagedObjectContext: レコードの操作を管理するマネージャー

NSManagedObjectはともかく、Contextはどういう役割を負っているのか、Multi-Context CoreData | Cocoaneticsを見てみると、たとえば次のような役割を負っているようですね。

  • PSC(Persistent Store Coordinator)へのデータ反映
  • NSFetchedResultContextへの通知

つまり、データに変更を加える場合、次のような手順が発生します。

  1. NSManagedObjectに変更を加える
  2. そのオブジェクトが属するNSManagedContextに対して更新通知を送る
  3. NSManagedContextがPSCに対してデータ反映を要求
  4. NSManagedContextがNSFetchedResultContextに対してデータ更新通知を送る

また、この際、マルチスレッドでデータ更新ができるよう、ContextはContext間で親子関係を保持することが可能になっています。

このとき、ContextはPSCのデータのキャッシュを保持しており、それらの間の差分はContextを利用して解消することになります。

おおざっぱに例えると、gitのbranchの派生関係のようなものでしょうか。

そのため、NSManagedObjectがどのContextに属するものかを注意して扱わないと、データの不整合によるクラッシュが発生するので、注意が必要です。

参考