KVO的一个例子

实现KVO的一个例子

结构:
这里写图片描述

之前写过KVO的原理,这里放一个简单的例子。

既然KVO就是一个对象监视着另一个对象,那么我就写一个这样的小故事,就是从前有一个女孩,就是OYME,她找了个男朋友OYBoyFriend,这个男朋友十分关注OYME,OYME开心,他就开心,OYME不开心他就不开心。
也就是说,OYBoyFriend的mood属性要跟着OYME的mood属性变化。

下面是每个文件的代码:

OYME.h

#import <Foundation/Foundation.h>

@interface OYME : NSObject

@property (getter=getMood,setter=setMood:)NSString *mood;

-(instancetype)initWithMood:(NSString *)myMood;
+(instancetype)meWtihMood:(NSString *)myMood;
-(void)setMood:(NSString *)mood;
-(NSString *)getMood;
+(BOOL)automaticallyNotifiesObserversForKey:(NSString *)key;
-(void)say;

@end

OYME.m

#import "OYME.h"

@implementation OYME
@synthesize mood =_mood;
-(instancetype)initWithMood:(NSString *)myMood{
    self = [super init];
    if(self){
        [self willChangeValueForKey:_mood];
        _mood=myMood;
        [self didChangeValueForKey:_mood];
    }
    return self;
}
+(instancetype)meWtihMood:(NSString *)myMood{
    return [[OYME alloc]initWithMood:myMood];
}
+(BOOL)automaticallyNotifiesObserversForKey:(NSString *)key;{
    BOOL automatic=NO;
    return automatic;
}
-(void)say{
    NSLog(@"Girl:  I'm %@!\n",_mood);
}
-(void)setMood:(NSString *)mood{
    if(![_mood isEqual:mood]){
        [self willChangeValueForKey:@"mood"];
        _mood=mood;
        [self say];
        [self didChangeValueForKey:@"mood"];
    }
}
-(NSString *)getMood{
    return _mood;
}
@end

OYBoyFriend.h

#import <Foundation/Foundation.h>
@class OYME;
@interface OYBoyFriend : NSObject
@property NSString *mood;
-(instancetype)initWithMood:(NSString *)myMood;
+(instancetype)boyFriendWithMood:(NSString *)myMood;
-(void)sayTo:(OYME *)myGirl;
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context;
-(void)say;
@end

OYBoyFriend.m

#import "OYBoyFriend.h"
#import "OYME.h"
@implementation OYBoyFriend
-(instancetype)initWithMood:(NSString *)myMood{
    self=[super init];
    if(self){
        _mood=myMood;
    }
    return self;
}
+(instancetype)boyFriendWithMood:(NSString *)myMood{
    return [[OYBoyFriend alloc]initWithMood:myMood];
}

-(void)sayTo:(OYME *)myGirl{
    NSLog(@"Boy:  You're %@, I'm %@",myGirl.mood,_mood);
}
-(void)say{
    NSLog(@"Boy:  I'm %@!\n",_mood);
}
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context{
    if ([keyPath isEqual:@"mood"]) {
        _mood=[[change objectForKey:NSKeyValueChangeNewKey] copy];
        [self say];
    }
}
@end

写完这个故事的main.m

#import <Foundation/Foundation.h>
#import "OYStudent.h"
#import "OYME.h"
#import "OYBoyFriend.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        OYBoyFriend *boyFriend=[OYBoyFriend boyFriendWithMood:@"soso"];

        [boyFriend say];

        OYME *me=[OYME meWtihMood:@"sad"];
        [me addObserver:boyFriend forKeyPath:@"mood" options:NSKeyValueObservingOptionNew context:NULL];
        [me setMood:@"happy"];//me的setMood方法里调用了me的say方法。如果不在这个set方法中调用,而是在setMood之后紧接着调用say方法的话,效果和现在的不一样。
        [boyFriend sayTo:me];

        [me removeObserver:boyFriend forKeyPath:@"mood"];
    }

    return 0;
}

运行结果就是这个样子:

这里写图片描述

这样的男朋友你想要吗????

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值