« Technical Q&A QA1554 - Cocoa の delegate でよくあるまちがい | トップページ | うすうす SQLite3 Cocoa ラッパー OmniSQLite »

2008.03.12

KSExtensibleManagedObject でなんでも CoreData に

The Mac DEVELOPER NETWORK の Core Data Managed Object Extension Class 経由で、Mike Abdullah の KSExtensibleManagedObject

CoreData でない実装のデータモデルを NSManagedObject に再実装することなく CoreData で利用したりするために利用できるプロキシのようなもの。

利用のしかたは、

  • KSExtensibleManagedObject の extensiblePropertiesDataKey というキーにデータをセットする
  • データは Key-Value Coding に対応していること
  • データは NSCoding に対応していること

たとえばこんな感じ。MyData が非 CoreData のデータオブジェクト。

  • obj.key1 -> NSManagedObject.key1
  • obj.key2 -> NSManagedObject.key2
  • obj.key3 -> MyData.key3
  • obj.key4 -> MyData.key4
  • obj.key5 -> MyData.key5
  • obj.extensiblePropertiesDataKey -> MyData

SandVox ではすごく役に立ったらしいのだけど、どうもピンとこない。永続化層を前の実装から CoreData のストアに移すだろうから、そのギャップのケアにもけっこう手がかかりそう。

実装は単純で、 valueForUndefinedKey:, setValue:forUndefinedKey: を使ってラップしたデータの KVC アクセスに変換しているだけ。undefinedKey なので、ちょっとだけ遅いかもしんない。コードはわりと小さいし、Key-Value Coding や Key-Value Observing それに CoreData/NSManagedObject のモデル外での属性追加の手法を見てみるのにはよいと思う。

|

« Technical Q&A QA1554 - Cocoa の delegate でよくあるまちがい | トップページ | うすうす SQLite3 Cocoa ラッパー OmniSQLite »