KVO будет корректно работать с пользовательскими установщиками свойств;это всегда имело место для классов, производных от NSObject.Механизм выполнения ищет вызов соответствующего метода установщика и неявно вызывает «willChangeValueForKey» перед выполнением установщика, а затем неявно вызывает «didChangeValueForKey» после завершения установки.
Вы можете отключить это автоматическое поведение, если выхотите иметь более детальный контроль над уведомлениями KVO.Как упомянуто выше, свойства только для чтения, значение которых вы изменяете путем изменения вспомогательного ivar, или значения которых получены путем расчета, являются местами, где вы должны использовать ручные уведомления (хотя есть механизм keyPathsAffectingValueFor, в котором вы можете указать среде выполнения, чтозначение свойства зависит от изменения другого свойства, и оно будет отправлять уведомление об изменении соответствующим образом.) Чтобы отключить автоматическое поведение для каждого свойства, вы добавляете метод класса + (BOOL) автоматическиNotifiesObserversOf и возвращаете NO.
Я часто отключаю автоматические уведомления KVO, потому что я обнаружил, что уведомление KVO генерируется при вызове установщика, даже если значение свойства устанавливается равным его текущему значению (например, без изменений).).Я хочу подавить бессмысленное уведомление ради эффективности:
+ (BOOL)automaticallyNotifiesObserversOfMyProperty
{
return NO;
}
- (void)setMyProperty:(NSInteger)myProperty
{
if(_myProperty != myProperty)
{
[self willChangeValueForKey:@"myProperty"];
_myProperty = myProperty;
[self didChangeValueForKey:@"myProperty"];
}
}
Хорошее обсуждение можно найти в заголовке NSKeyValueObserving.h, к которому вы можете перейти, нажав CMD +, щелкнув по именам методов "willChangeValueForKey" и"didChangeValueForKey" в XCode.