Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Send Notification When a Property is Changed Using KVO

I had a property named myName in my class, like:

@property (nonatomic, strong) NSString *myName;

I need to send a notification when the myName property's value is changed.

Now I'm doing something like:

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

I know there is something like Key-Value Observing in iOS. But I don't know how to implement it, I read the entire document, but couldn't get a good understanding.

Please help me to understand how to implement the same without using custom setter.

like image 718
Midhun MP Avatar asked Feb 14 '13 09:02

Midhun MP


2 Answers

Try this:

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

and implement

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

}

this method will be called anytime when myName property changes

like image 75
alex Avatar answered Oct 19 '22 10:10

alex


In - (void)setMyName:(NSString *)name do this instead

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

//this generates the KVO's

And where you want to listen (the viewController), there in viewDidLoad add this line:

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

//By doing this, you register the viewController for listening to KVO.

and also implement this method:

- (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 :)
    }
}

//this method is invoked, whenever the property's value is changed.

like image 44
devluv Avatar answered Oct 19 '22 11:10

devluv