Objective-C入门18:KVO

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值