Отправка уведомления при изменении свойства с помощью 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 автоматически.
(Вам нужно будет удалить наблюдателя, прежде чем вы отпустите наблюдаемый объект.)