Регистрация для наблюдения значения ключа
Для получения уведомлений наблюдения значения ключа для свойства три вещи требуются:
Наблюдаемый класс должен быть значением ключа, наблюдающим совместимый для свойства, которое Вы хотите наблюдать.
Необходимо зарегистрировать объект наблюдения в наблюдаемом объекте, с помощью метода
addObserver:forKeyPath:options:context:
.Класс наблюдения должен реализовать
observeValueForKeyPath:ofObject:change:context:
.
Регистрация как наблюдатель
Чтобы быть уведомленным относительно изменений в свойстве, объект наблюдения должен сначала зарегистрироваться в объекте, который будет наблюдаться путем отправки его addObserver:forKeyPath:options:context:
сообщение, передавая объект наблюдателя и ключевой путь свойства, которое будет наблюдаться. Параметр опций указывает информацию, предоставленную наблюдателю, когда отправляется уведомление изменения. Используя опцию NSKeyValueObservingOptionOld
указывает, что значение исходного объекта предоставлено для наблюдателя как запись в словаре изменения. Указание NSKeyValueObservingOptionNew
опция обеспечивает новое значение как запись в словаре изменения. Для получения обоих значений Вы были бы поразрядно OR
константы опции.
Пример в Перечислении 1 демонстрирует регистрацию объекта инспектора для свойства openingBalance
.
Перечисление 1 , Регистрирующее инспектора как наблюдатель openingBalance свойства
- (void)registerAsObserver { |
/* |
Register 'inspector' to receive change notifications for the "openingBalance" property of |
the 'account' object and specify that both the old and new values of "openingBalance" |
should be provided in the observe… method. |
*/ |
[account addObserver:inspector |
forKeyPath:@"openingBalance" |
options:(NSKeyValueObservingOptionNew | |
NSKeyValueObservingOptionOld) |
context:NULL]; |
} |
При регистрации объекта как наблюдатель можно также обеспечить указатель контекста. Указатель контекста предоставлен для наблюдателя когда observeValueForKeyPath:ofObject:change:context:
вызывается. Указатель контекста может быть указателем C или ссылкой на объект. Указатель контекста может использоваться в качестве уникального идентификатора для определения изменения, наблюдающегося, или предоставлять некоторые другие данные наблюдателю.
Получение уведомления об изменении
Когда значение наблюдаемого свойства объекта изменяется, наблюдатель получает observeValueForKeyPath:ofObject:change:context:
сообщение. Все наблюдатели должны реализовать этот метод.
Наблюдателю предоставлены объектный и ключевой путь, инициировавший уведомление наблюдателя, словарь, содержащий подробные данные об изменении и указатель контекста, который был предоставлен, когда был зарегистрирован наблюдатель.
Словарная статья изменения NSKeyValueChangeKindKey
предоставляет информацию о типе произошедшего изменения. Если значение наблюдаемого объекта изменилось, NSKeyValueChangeKindKey
возвраты записи NSKeyValueChangeSetting
. В зависимости от опций, указанных, когда наблюдатель был зарегистрирован, NSKeyValueChangeOldKey
и NSKeyValueChangeNewKey
записи в словаре изменения содержат значения свойства прежде, и после, изменение. Если свойство является объектом, значение предоставлено непосредственно. Если свойство является скаляром или структурой C, значение обертывается в NSValue
объект (как с кодированием значения ключа).
Если наблюдаемое свойство к - многие отношение, NSKeyValueChangeKindKey
запись также указывает, были ли объекты в отношении вставлены, удалены или заменены путем возврата NSKeyValueChangeInsertion
, NSKeyValueChangeRemoval
, или NSKeyValueChangeReplacement
, соответственно.
Словарная статья изменения для NSKeyValueChangeIndexesKey
NSIndexSet
объект, указывающий индексы в изменившемся отношении. Если NSKeyValueObservingOptionNew
или NSKeyValueObservingOptionOld
когда наблюдатель регистрируется, указаны как опции NSKeyValueChangeOldKey
и NSKeyValueChangeNewKey
записи в словаре изменения являются массивами, содержащими значения связанных объектов прежде, и после, изменение.
Пример в Перечислении 2 показывает observeValueForKeyPath:ofObject:change:context:
реализация для инспектора, отражающего старые и новые значения свойства openingBalance
, как зарегистрировано в Перечислении 1.
Реализация перечисления 2 observeValueForKeyPath:ofObject:change:context:
- (void)observeValueForKeyPath:(NSString *)keyPath |
ofObject:(id)object |
change:(NSDictionary *)change |
context:(void *)context { |
if ([keyPath isEqual:@"openingBalance"]) { |
[openingBalanceInspectorField setObjectValue: |
[change objectForKey:NSKeyValueChangeNewKey]]; |
} |
/* |
Be sure to call the superclass's implementation *if it implements it*. |
NSObject does not implement the method. |
*/ |
[super observeValueForKeyPath:keyPath |
ofObject:object |
change:change |
context:context]; |
} |
Удаление объекта как наблюдатель
Вы удаляете наблюдателя значения ключа путем отправки наблюдаемого объекта a removeObserver:forKeyPath:
сообщение, указывая наблюдение возражает и ключевой путь. Пример в Перечислении 3 удаляет инспектора как наблюдателя openingBalance
.
Перечисление 3 , Удаляющее инспектора как наблюдатель openingBalance
- (void)unregisterForChangeNotification { |
[observedObject removeObserver:inspector forKeyPath:@"openingBalance"]; |
} |
Если контекст является объектом, необходимо сохранить сильную ссылку к нему до удаления наблюдателя. После получения a removeObserver:forKeyPath:
сообщение, объект наблюдения больше не будет принимать никого observeValueForKeyPath:ofObject:change:context:
сообщения для указанного ключевого пути и объекта.