ページ

2010年1月27日水曜日

BlogAssistant(9) CoreData - awakeFromInsert の使用

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

(前回)Cocoaの日々: BlogAssistant(8) - Safariプラグインとビューアの分離

モデルへ新たに作成日時を保持する createdDate を追加した。


現在日時を入れることがわかっているので、NSManagedObjectを新規に作成した時には自動的にセットした。

そういった目的のために NSManagedObject には -[awakeFromInsert] が用意されている。
Mac Dev Center: NSManagedObject Class Reference - awakeFromInsert

NSManagedObject が新規に作成される時に呼び出される。サブクラスでこれをオーバーライドすると初期化処理を書く事ができる。

こんな感じ。

- (void) awakeFromInsert {
    [super awakeFromInsert];
    [self setPrimitiveValue:[NSDate date] forKey:@"createdDate"];
}

上記では createdDate に現在日時をセットしている。


この awakeFromInsert には利用上いくつか注意点がある。
  • 必ず先頭で親クラスの awakeFromInsert を呼び出す
  • [1]作成 => [2]Undo(作成取り消し) => [3]Redo(再作成) の操作を行った場合、[3]では呼び出されない
  • メソッド内で fetch操作を行うと副作用が出る(場合がある)
  • primitive accessor (setPrimitiveValue:forKey:など) を使うのが望ましい。これは Undo/Redoが正しく働かせるため。
最後の点について、通常 NSManagedObject のサブクラスでは属性を @property宣言して、 @dynamic 扱いにするので(つまり CoreDataフレームワークが動的にメソッドを追加する)、恐らく下記コードでも良いと思う。試したところ設定は問題なし。Undo/Redoは試していない。

 self.createdDate = [NSDate date];