CoreDataを操作する際にはNSManagedObject
とNSManagedObjectContext
を利用します。
この2つは、次のような関係にあります。
- NSManagedObject: 操作対象のレコードを表すオブジェクト
- NSManagedObjectContext: レコードの操作を管理するマネージャー
NSManagedObjectはともかく、Contextはどういう役割を負っているのか、Multi-Context CoreData | Cocoaneticsを見てみると、たとえば次のような役割を負っているようですね。
- PSC(Persistent Store Coordinator)へのデータ反映
NSFetchedResultContext
への通知
つまり、データに変更を加える場合、次のような手順が発生します。
NSManagedObject
に変更を加える- そのオブジェクトが属する
NSManagedContext
に対して更新通知を送る - NSManagedContextがPSCに対してデータ反映を要求
- NSManagedContextが
NSFetchedResultContext
に対してデータ更新通知を送る
また、この際、マルチスレッドでデータ更新ができるよう、ContextはContext間で親子関係を保持することが可能になっています。
このとき、ContextはPSCのデータのキャッシュを保持しており、それらの間の差分はContextを利用して解消することになります。
おおざっぱに例えると、gitのbranchの派生関係のようなものでしょうか。
そのため、NSManagedObjectがどのContextに属するものかを注意して扱わないと、データの不整合によるクラッシュが発生するので、注意が必要です。