Автообновление отметки времени изменения свойства NSManagedObject - PullRequest
7 голосов
/ 29 декабря 2011

У меня есть NSManagedObject с двумя свойствами:

NSNumber *score;
NSDate *score_timestamp;

Я хочу, чтобы мое поле score_timestamp обновлялось при каждом обновлении score.

Я явно не могу использовать-willSave метод, поскольку мой контекст иногда сохраняется, и score_timestamp не будет обновляться.Поэтому я должен либо переопределить -setScore:, либо настроить свой управляемый объект в качестве наблюдателя значения ключа для своего собственного поля score.

Решение -setScore: кажется простым:

- (void) setScore:(NSNumber *)score
{
    [self willChangeValueForKey:@"score"];
    [self setPrimitiveScore:score];
    [self didChangeValueForKey:@"score"];

    self.score_timestamp = [NSDate date];
}

Есть ли какие-то предостережения в том, чтобы так поступать?Или я должен использовать решение KVO?

Обновление

До сих пор я получил два ответа, что мой код не будет работать через setValue: forKey:, и я до сих поржду например.Наивный вызов [(NSManagedObject *)myObject setValue:value forKey:@"score"] все равно вызывает мой установщик.

Так что, если я переключусь на решение KVO, должен ли я addObserver: во всех awake методах и удалить его в willTurnIntoFault?Или это не так просто?

Ответы [ 3 ]

4 голосов
/ 31 декабря 2011

Реализация в вашем вопросе в порядке. Любая попытка KVC обновить ваше значение также будет проходить через метод установки (setValue: forKey: просто ищет метод доступа, соответствующий setKey, подробности см. здесь ).

1 голос
/ 02 января 2012

Вы ищете Наблюдение значения ключа

[objectWithArray addObserver:self 
                  forKeyPath:@"score"
                     options:NSKeyValueObservingOptionNew 
                     context:nil];

Затем, чтобы наблюдать это:

-(void)observeValueForKeyPath:(NSString *)keyPath 
                      ofObject:(id)object 
                        change:(NSDictionary *)change 
                       context:(void *)context 
{
    //Check if [change objectForKey:NSKeyValueChangeNewKey] is equal to "score" 
    //and update the score_timestamp appropriately
}

Вы должны зарегистрироваться для уведомления, когда вы просыпаетесьЯ полагаю, что из-за ошибки и незарегистрированной, когда ты виноват.

0 голосов
/ 29 декабря 2011

В этом методе, если по какой-либо причине вы изменяете объект не как свой пользовательский подкласс, а как NSManagedObject, используя setValue: forKey:, дата не будет обновлена.

...