Сложный вызов, ИМХО оба варианта - отстой.
Первый вынуждает вас написать свой собственный установщик, который содержит много стандартного кода. (Не говоря уже о том, что вы должны помнить, что вы также должны запускать уведомления KVO с willChangeValueForKey:
и didChangeValueForKey:
, если хотите, чтобы KVO для рассматриваемого свойства работало.)
Второй варианттакже довольно тяжелый, и вашей реализации недостаточно.Что если в вашем суперклассе также есть немного КВО?Вам нужно было бы позвонить super
где-нибудь в обработчике.Если нет, вы уверены, что ваш суперкласс не изменится?(Подробнее о KVO в связанном вопросе .)
Иногда вы можете обойти проблему, используя другие методы, такие как привязки (если вы на Mac) или обычные уведомления (вы можете опубликоватьуведомление о том, что модель изменилась, и все заинтересованные стороны должны обновить ее.)
Если у вас много подобных перерасчетов и вы не можете найти лучшего пути, я бы попытался написать суперкласс с лучшей поддержкой наблюдений, с интерфейсомкак это:
[self addTriggerForKeyPath:@"foo" action:^{
NSLog(@"Foo changed.");
}];
Это займет больше работы, но будет держать ваши классы в чистоте, и вы сможете решить все проблемы, связанные с КВО, в одном месте.Если пересчитанных свойств недостаточно для этого, я обычно выбираю первое решение (пользовательский установщик).