您的位置:首页 > 其它

OC_KVO、notification和Block实现保姆小孩间的通信关联

2016-03-06 14:31 399 查看
题目:有两个类Baby和Nanny,baby拥有属性happy,通过观察者模式、通知和Block块来实现nanny观察baby的happy值变化,并作出相应操作。

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文件同上

结果同上
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息