Objective-C入门18:KVO
main.m
#import <Foundation/Foundation.h>
#import "Dog.h"
#import "Parson.h"
#import "Yinger.h"
#import "Baomu.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
// key---value---observer (键值观察者)
// 通过 key 来观察 value 的变化 去做出响应
// KVO (键值观察者)主要用于视图交互方面,比如界面的某些数据变化了,
// 界面的显示也跟着需要变化,那就是要建立数据和界面的关联
// KVO 是一对一的传值
// 通过 key 来监测 值是否发生改变 如果发生改变 就会自动调用 KVO 的响应方法
Dog *daHuLang = [ [ Dog alloc ] init ] ;
daHuLang.face = @"smile" ;
// 使用的 KVC 的知识
[ daHuLang setValue:@"耸拉着" forKey:@"weiBa" ] ;
Parson *liBai = [ [ Parson alloc ] init ] ;
[ liBai watchDog:daHuLang ] ;
daHuLang.face = @"wang!wang!wang!" ;
[ daHuLang setValue:@"摇着尾巴" forKey:@"weiBa" ] ;
Yinger *daBao = [ [ Yinger alloc ] init ] ;
[ daBao setValue:@"平静" forKey:@"zhuangtai" ] ;
Baomu *baomu = [ [ Baomu alloc ] init ];
[ baomu watchYinger:daBao ] ;
[ daBao setValue:@"ha~ha~" forKey:@"zhuangtai" ] ;
// [ daBao setValue:@"wa~wa~" forKey:@"zhuangtai" ] ;
}
return 0;
}
Parson.h
#import <Foundation/Foundation.h>
@class Dog ;
@interface Parson : NSObject
{
Dog *watchDog ;
}
// 遇到一只狗 观察狗表情的变化
- (void)watchDog:(Dog *) dog ;
@end
Parson.m
<pre name="code" class="objc">#import "Parson.h"
#import "Dog.h"
@implementation Parson
- (void)watchDog:(Dog *) dog
{
watchDog = dog ;
// 观察狗的表情
[ watchDog addObserver : self forKeyPath:@"face" options : NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context : nil ] ;
[ watchDog addObserver : self forKeyPath:@"weiBa" options :
NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context : nil ] ;
}
// 狗的新旧表情发生改变 会自动调用这个方法
// keyPath 来判断 是不是咱们观察的 key 对应的值 发生改变
// change 是一个字典 字典里面放了 新旧属性值的内容
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
if ( [ keyPath isEqualToString:@"face" ] )
{
NSLog(@"%@",change);
NSLog(@"狗的表情由%@变成%@",change[@"old"],change[@"new"]);
[ self shutdown ] ;
}
if ( [ keyPath isEqualToString : @"weiBa" ] )
{
NSLog(@"狗的尾巴由%@变成%@",change[@"old"],change[@"new"]);
[ self toEat ] ;
}
}
- (void)toEat
{
NSLog(@"扔一大块肉~" ) ;
}
- (void)shutdown
{
NSLog( @"打死" ) ;
}
- (void)dealloc
{
[ watchDog removeObserver : self forKeyPath:@"face" ] ;
[ watchDog removeObserver : self forKeyPath:@"weiBa" ] ;
}
@end
Dog.h
#import <Foundation/Foundation.h>
@interface Dog : NSObject
{
NSString *weiBa ;
}
@property (nonatomic,copy) NSString *face ;
@end
Dog.m
#import "Dog.h"
@implementation Dog
@end
Baomu.h
#import <Foundation/Foundation.h>
@class Yinger ;
@interface Baomu : NSObject
{
Yinger *watchYinger ;
}
// 观察婴儿表情的变化
- (void)watchYinger:(Yinger *) yinger ;
@end
Baomu.m
#import "Baomu.h"
#import "Yinger.h"
@implementation Baomu
- (void)watchYinger:(Yinger *)yinger
{
watchYinger = yinger ;
// 观察婴儿的表情
[ watchYinger addObserver : self forKeyPath:@"zhuangtai" options : NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context : nil ] ;
}
// 狗的新旧表情发生改变 会自动调用这个方法
// keyPath 来判断 是不是咱们观察的 key 对应的值 发生改变
// change 是一个字典 字典里面放了 新旧属性值的内容
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
if ( [ keyPath isEqualToString:@"zhuangtai" ] )
{
NSLog(@"%@",change);
NSLog(@"婴儿的表情由%@变成%@",change[@"old"],change[@"new"] );
if ( [ change[@"new"] isEqualToString: @"wa~wa~" ] )
{
NSLog( @"保姆喂奶" ) ;
}
else if ( [ change[@"new"] isEqualToString: @"ha~ha~" ] )
{
NSLog(@"保姆给一个玩具" ) ;
}
}
}
- (void)dealloc
{
[ watchYinger removeObserver : self forKeyPath:@"zhuangtai" ] ;
}
@end
Yinger.h
#import <Foundation/Foundation.h>
@interface Yinger : NSObject
{
NSString *zhuangtai ;
}
@end
Yinger.m
#import "Yinger.h"
@implementation Yinger
@end