Я бы порекомендовал вам взглянуть на категорию инструментов Google для Mac GTMNSObject + KeyValueObserving.h или хотя бы на блог пост Майкла Эша, который вдохновил ее. По сути, правильное ручное КВО очень тонко , а шаблон, предлагаемый API, не идеален. Гораздо лучше поместить в API другой слой (как это делает GTMNSObject + KeyValueObserving), который делает вещи более похожими на NSNotification
API и скрывает некоторые источники тонких ошибок.
Используя GTMNSObject + KeyValueObserving, вы бы сделали
[theObject gtm_addObserver:self
forKeyPath:@"myKeyPath"
selector:@selector(myCallbackSelector:)
userInfo:nil
options:NSKeyValueObservingOptionNew];
и ваш -myCallbackSelector:
будет вызван, когда значение в @"myKeyPath"
изменится с аргументом типа GTMKeyValueChangeNotification
, который инкапсулирует всю необходимую информацию, которая может вам понадобиться.
Таким образом, вам не нужно иметь большую таблицу диспетчеризации в observeValueForKeyPath:ofObject:change:context
(в действительности она поддерживается для вас категорией) или вам нужно беспокоиться о правильном способе использования указателя context
, чтобы избежать конфликт с супер / субклассами и т. д.