didChangeValueForKeyの使い方

NSManagedObjectには「- (void)didChangeValueForKey:(NSString *)key」というメソッドがあります。同クラスを継承しているデータモデルのクラスでは、同メソッドをオーバーライドすることにより、何か値が変更された後に任意の処理を実行されることができます。

@implementation Event
@dynamic name;
- (void)didChangeValueForKey:(NSString *)key {
    [super didChangeValueForKey:key];
    if ([key isEqualToString:@"name"] {
        // keyがnameの場合、name(changed)という形式に置き換える。
        NSString *changedName = [NSString stringWithFormat:@"%@(changed)", [self primitiveValueForKey:key]];
        [self setPrimitiveValue:changedName forKey:key];
    }
}

なお、このようなメソッドの中で各プロパティにアクセスする際は、primitive accessorを使用しないと処理がループしてしまうので注意が必要だと思います。例えば「self.name = changedName」とかsetterを呼ぶと、再度didChangeValueForKeyやwillChangeValueForKeyなどが呼ばれてしまうからです。同様の理由で、willSaveメソッドなども、下記のように実装したほうがいいと思われます。

- (void)willSave {
[super willSave];
// 更新日時に現在の時刻を設定する。
[self setPrimitiveValue:[NSDate date] forKey:@"updatedAt"];
}

この記事が役に立った場合、シェアしていただけると励みになります!!