OC_KVO、notification和Block实现保姆小孩间的通信关联
2016-03-06 14:31
399 查看
题目:有两个类Baby和Nanny,baby拥有属性happy,通过观察者模式、通知和Block块来实现nanny观察baby的happy值变化,并作出相应操作。
Baby.m文件
Nanny.h文件
Nanny.m文件
main.m文件
结果:
Baby.m文件
Nanny.h文件
Nanny.m文件
main.m文件
结果:
Baby.m文件
Nanny.h文件
Nanny.m文件
main.m文件同上
结果同上
1.使用KVO观察者模式
Baby.h文件import <Foundation/Foundation.h> @interface Baby : NSObject //baby的happy属性 @property(nonatomic,assign)NSInteger happy; //定时器属性 @property(nonatomic,strong)NSTimer *timer; //重写初始化方法 -(instancetype)init; //停止定时器方法 -(void)stopTimer; @end
Baby.m文件
import "Baby.h" @implementation Baby -(instancetype)init{ if(self=[super init]){ _happy=100;//为happy属性赋初始值100 //创建一个定时器 _timer=[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(observeHappy) userInfo:nil repeats:YES]; } return self; } //定时器调用的方法 -(void)observeHappy{ self.happy-=1; } -(void)stopTimer{ [_timer invalidate]; } @end
Nanny.h文件
import <Foundation/Foundation.h> @class Baby; @interface Nanny : NSObject //baby属性 @property(nonatomic,strong)Baby *baby; //重写初始化方法并为baby赋值 -(instancetype)initWithBaby:(Baby *)baby; @end
Nanny.m文件
import "Nanny.h" import "Baby.h" @implementation Nanny -(instancetype)initWithBaby:(Baby *)baby{ if(self=[super init]){ _baby=baby; //为baby添加观察者 [_baby addObserver:self forKeyPath:@"happy" options:NSKeyValueObservingOptionNew context:nil]; } return self; } //调用观察者的方法,当baby的属性变化时,可在此方法中接收到并做相关的操作 -(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{ //获取此时baby的属性值 NSNumber *num=[change objectForKey:@"new"]; NSInteger value=[num integerValue]; NSLog(@"baby的happy值为:%ld",value); ![这里写图片描述](https://img-blog.csdn.net/20160306102625990) if(value<95){ NSLog(@"保姆给baby洗澡了"); //设置baby的属性值 _baby.happy=100; //调用baby的停止定时器方法 [_baby stopTimer]; } } -(void)dealloc{ //在保姆对象销毁时将baby的观察者移除 [_baby removeObserver:self forKeyPath:@"happy"]; } @end
main.m文件
import <Foundation/Foundation.h> import "Baby.h" import "Nanny.h" int main(int argc, const char * argv[]) { @autoreleasepool { Baby *baby=[[Baby alloc]init]; Nanny *nanny=[[Nanny alloc]initWithBaby:baby]; [[NSRunLoop currentRunLoop]run]; } return 0; }
结果:
2.使用通知
Baby.h文件import <Foundation/Foundation.h> @interface Baby : NSObject //baby的happy属性 @property(nonatomic,assign)NSInteger happy; //重写初始化方法 -(instancetype)init; @end
Baby.m文件
import "Baby.h" @implementation Baby - (instancetype)init { self = [super init]; if (self) { _happy=100; [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(changeHappy) userInfo:nil repeats:YES]; } return self; } -(void)changeHappy{ _happy--; //创建通知,发送消息 [[NSNotificationCenter defaultCenter] postNotificationName:@"happy" object:self]; } @end
Nanny.h文件
import <Foundation/Foundation.h> @class Baby; @interface Nanny : NSObject @property(nonatomic)Baby *baby; -(instancetype)initWithBaby:(Baby *)baby; @end
Nanny.m文件
import "Nanny.h" import "Baby.h" @implementation Nanny -(instancetype)initWithBaby:(Baby *)baby{ if(self=[super init]){ _baby=baby; //为通知中心添加观察者 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playWithBaby:) name:@"happy" object:nil]; } return self; } //当接收到通知后调用的方法 -(void)playWithBaby:(NSNotification *)notification{ Baby *baby=notification.object; NSInteger happy=baby.happy; NSLog(@"baby的happy值为:%ld",happy); if (happy<95) { NSLog(@"保姆陪baby快乐的玩耍"); baby.happy=100; } } //当Nanny销毁时将通知中心销毁 -(void)dealloc{ [[NSNotificationCenter defaultCenter] removeObserver:self name:@"happy" object:_baby]; } @end
main.m文件
import <Foundation/Foundation.h> import "Baby.h" import "Nanny.h" int main(int argc, const char * argv[]) { @autoreleasepool { Baby *baby=[[Baby alloc]init]; Nanny *nanny=[[Nanny alloc]initWithBaby:baby]; [[NSRunLoop currentRunLoop]run]; } return 0; }
结果:
3.使用Block
Baby.h文件import <Foundation/Foundation.h> @interface Baby : NSObject @property(nonatomic,assign)NSInteger happy; //baby拥有的Block块属性 @property(nonatomic,copy)NSInteger(^block)(); -(instancetype)init; @end
Baby.m文件
import "Baby.h" @implementation Baby - (instancetype)init { self = [super init]; if (self) { _happy=100; [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(changeHappy) userInfo:nil repeats:YES]; } return self; } -(void)changeHappy{ _happy--; NSLog(@"baby的happy值为%ld",_happy); if(_happy<95){ NSLog(@"保姆给baby洗澡了"); //从block块中获取值 _happy=_block(); } } @end
Nanny.h文件
import <Foundation/Foundation.h> @class Baby; @interface Nanny : NSObject @property(nonatomic,strong)Baby *baby; -(instancetype)initWithBaby:(Baby *)baby; @end
Nanny.m文件
import "Nanny.h" import "Baby.h" @implementation Nanny -(instancetype)initWithBaby:(Baby *)baby{ if(self=[super init]){ _baby=baby; //设置baby的block [_baby setBlock:^NSInteger{ return 100; }]; } return self; } @end
main.m文件同上
结果同上
相关文章推荐
- C#实现子窗体与父窗体通信方法实例总结
- Ruby中Block和迭代器的使用讲解
- Ruby中使用Block、Proc、lambda实现闭包
- Ruby中的block、proc、lambda区别总结
- C#中观察者模式的3种实现方式
- 浅谈Nodejs观察者模式
- java和c#使用hessian通信的方法
- win32下进程间通信(共享内存)实例分析
- WinForm实现跨进程通信的方法
- C#中使用UDP通信实例
- ASP.NET UserControl 通信的具体实现
- C#设计模式之观察者模式实例讲解
- 学习JavaScript设计模式之观察者模式
- jQuery的观察者模式详解
- Android源码学习之观察者模式应用及优点介绍
- php设计模式之观察者模式的应用详解
- 浅析iOS应用开发中线程间的通信与线程安全问题
- Python设计模式之观察者模式实例
- C#中委托和事件在观察者模式中的应用实例
- C++设计模式之观察者模式