KVO

来源:互联网 发布:php招聘要求 编辑:程序博客网 时间:2024/05/22 12:54

person.h


#import <Foundation/Foundation.h>

#import "Watcher.h"

@class Watcher;

@interface Person : NSObject


@property (nonatomic,strong)NSString *name;

@property (nonatomic,strong)NSString *address;

@property (nonatomic,strong)Watcher *watcher;


-(void)addWatcher:(Watcher *)watcher;

-(void)update;


@end


person.m


#import "Person.h"


@implementation Person


-(void)addWatcher:(Watcher *)watcher

{

    self.watcher = watcher;

    //为当前类添加一个观察者,当地址发生变化时,观察者会接收到通知

    [selfaddObserver:_watcherforKeyPath:@"address"options:NSKeyValueObservingOptionNew |

        NSKeyValueObservingOptionOld

        context:@"address changed"];

}


-(void)update

{

    self.address =@"beijing";


}

-(void)dealloc

{

    //移除观察者

    [selfremoveObserver:_watcherforKeyPath:@"address"];

}

@end


watcher.h

#import <Foundation/Foundation.h>


@interface Watcher : NSObject


@end


watcher.m


#import "Watcher.h"


@implementation Watcher

//观察者必须要实现这个方法,用于接收被观察者发来的通知,并进行处理

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context

{

    NSLog(@"obj:%@ change:%@ keyPath:%@,context:%@",object,change,keyPath,context);

    NSString *newAddress = [objectvalueForKeyPath:keyPath];

    NSLog(@"%@:%@",context,newAddress);

}

@end


main.m


#import <Foundation/Foundation.h>

#import "Person.h"

#import "Watcher.h"

int main(int argc,const char * argv[]) {

    @autoreleasepool {

        Person *person = [[Personalloc]init];

        Watcher *watcher = [[Watcheralloc]init];

        [person addWatcher:watcher];

        person.address =@"beijing";

        person.address =@"shanghai";

        

    }

    return0;

}




0 0
原创粉丝点击