Я видел эти строки в демонстрационном проекте, но я не мог понять, почему он сделал это.
[self willChangeValueForKey:@"names"];
[self didChangeValueForKey:@"names"];
Это сразу назвало didChangeValueForKey после willChangeeValueForKey. Это имеет какой-либо смысл?
Кроме того, когда должно быть правильное время для вызова этого двумя методами?Большое спасибо!!:)
Фактически, это антипаттерн. Вы не должны вызывать -willChangeValueForKey:
, за которым следует -didChangeValueForKey:
без какого-либо фактического изменения свойства. В некоторых случаях это может замаскировать проблемы KVO в другом месте вашего кода и вынудить наблюдателей обновить свое состояние, связанное с рассматриваемым свойством. Однако в конечном итоге вы (или автор приведенного вами примера) должны исправить остальную часть кода, чтобы в этом анти-шаблоне не было необходимости.
Правильное использование -will | didChangeValueForKey:
- это когда вы изменяете свойство без использования KVC-совместимых средств доступа / установки, так что механизм KVO не заметит изменения. В качестве надуманного примера рассмотрите возможность изменения переменной экземпляра поддержки для атрибута напрямую:
@interface Foo
{
int bar;
}
@end
@implementation Foo
- (void)someMethod
{
bar = 10;
}
@end
Наблюдатели KVO, которые зарегистрировались для уведомления об изменениях в свойстве bar
, не будут получать уведомление об изменении в bar
в -someMethod
. Чтобы заставить механизм KVO работать, вы можете изменить -someMethod
:
- (void)someMethod
{
[self willChangeValueForKey:@"bar"];
bar = 10;
[self didChangeValueForKey:@"bar"];
}
Конечно, было бы лучше использовать объявление @property
и использовать KVC-совместимые средства доступа / установки (либо вручную, либо @synthesized
), но это надуманный пример.
Это связано с ручным управлением наблюдением за значением ключа. Обычно об этом заботится система, но эти параметры позволяют вам контролировать ситуацию. Посмотрите эту документацию, чтобы понять, когда и как их использовать здесь.
Изменить: игнорировать меня, читал слишком быстро - Барри прав: -)