iOS
Наблюдение за ключевыми значениями
Поиск…
замечания
KVC : - кодирование с ключом
Обычно переменные экземпляра получают доступ через свойства или аксессоры, но KVC дает другой способ доступа к переменным в виде строк. Таким образом, ваш класс действует как словарь, а ваше имя свойства, например, «возраст» становится ключевым, а значение, которое свойство сохраняет, становится значением для этого ключа.
For example, you have employee class with "age" property. Normally we access like this.
emp.age = @”20″;
NSString age = emp.age;
But KVC works like this:
[emp valueForKey:@"age"];
[emp setValue:@"25" forKey:@"age"];
KVO : - Наблюдатель по ключевым значениям
Механизм, посредством которого объекты уведомляются при изменении какого-либо свойства, называется KVO. Ex.: уведомление о клавиатуре
Например, объект person заинтересован в получении уведомления, когда свойство AccountBalance изменено в объекте BankAccount. Чтобы достичь этого, Person Object должен зарегистрироваться в качестве наблюдателя в свойстве AccountAccount AccountBalance, отправив addObserver: forKeyPath: options: context: message.
Использование контекста для наблюдения KVO
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context
Контекст важен, если вы отправляете свой класс для использования другими пользователями. Контекст позволяет наблюдателю вашего класса проверять, что его вызывающий наблюдатель.
Проблема с пропуском наблюдателя заключается в том, что если какой-то один подкласс вашего класса и зарегистрировать наблюдателя для одного и того же объекта, тот же ключ и он не передает контекст, тогда суперкласс-наблюдатель можно назвать многократным.
Хорошим контекстом является переменная, уникальная и внутренняя для вашего использования.
Для дополнительной информации.
Наблюдение свойства подкласса NSObject
Большинство функций KVO и KVC уже реализованы по умолчанию во всех подклассах NSObject
.
Чтобы начать наблюдать свойство с именем firstName
объекта с именем personObject
выполните это в классе наблюдения:
[personObject addObserver:self
forKeyPath:@"firstName"
options:NSKeyValueObservingOptionNew
context:nil];
Объект, который self
в вышеприведенном коде ссылается, затем получит сообщение observeValueForKeyPath:ofObject:change:context:
при каждом изменении пути отслеживаемого ключа.
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary<NSString *,id> *)change
context:(void *)context
{
NSLog(@"new value of %@ is: %@", keyPath, change[NSKeyValueChangeNewKey]);
}
«Ключевой путь» - это термин КВК. Подклассы NSObject
реализуют функциональность KVC по умолчанию.
Переменная экземпляра с именем _firstName
будет доступна с помощью ключевого пути @"firstName"
.
Метод getter с именем firstName
будет вызываться при доступе к ключевому пути @"firstName"
, независимо от _firstName
переменной экземпляра setFirstName
или setFirstName
.