Отправка уведомления при изменении свойства с помощью KVO

У меня было свойство с именем myName в моем классе, например:

@property (nonatomic, strong) NSString *myName;

Мне нужно отправить уведомление, когда значение свойства myName будет изменено.

Теперь я делаю что-то вроде:

- (void)setMyName:(NSString *)name
{
  _myName = name;
  [[NSNotificationCenter defaultCenter] postNotificationName:CHANGE_NOTIFICATION object:nil];
}

Я знаю, что в iOS есть что-то вроде Наблюдение за ключевыми значениями. Но я не знаю, как его реализовать, я прочитал весь документ, но не смог получить хорошее понимание.

Пожалуйста, помогите мне понять, как реализовать то же самое без использования настраиваемого сеттера.

Ответы

Ответ 1

Попробуйте следующее:

MyClass *var = [MyClass new];
[var addObserver:self forKeyPath:@"myName" options:NSKeyValueChangeOldKey context:nil];

и реализовать

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{

}

этот метод будет вызываться в любое время, когда свойство myName изменяется

Ответ 2

В - (void)setMyName:(NSString *)name сделайте это вместо

[self willChangeValueForKey:@"myName"];
_myName = name;
[self didChangeValueForKey:@"myName"];

//this generates the KVO's

И где вы хотите прослушать (viewController), там в viewDidLoad добавьте эту строку:

[w addObserver: self forKeyPath: @ "myName" options: NSKeyValueObservingOptionNew context: nil];

//При этом вы регистрируете viewController для прослушивания KVO.

а также реализовать этот метод:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
    if ([[change objectForKey:NSKeyValueChangeNewKey] isEqual:[NSNull null]]) {
        return;
    } else {
        //read the change dictionary, and have fun :)
    }
}

//этот метод вызывается, когда изменяется значение свойства.

Ответ 3

Чтобы сделать это без настройки клиента, просто синтезируйте средство настройки свойств. Это создаст все поддерживающие вызовы willChangeValueForKey/didChangeValueForKey.

@synthesize myName;

Затем задайте значения свойств с помощью точечного синтаксиса:

self.myName = @ "Inigo Montoya"

Затем наблюдатели получат уведомление KVO автоматически.

(Вам нужно будет удалить наблюдателя, прежде чем вы отпустите наблюдаемый объект.)