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

本文介绍如何使用KVO观察者模式、通知及Block实现Nanny观察Baby的happy值变化,并作出响应。通过三个不同方法实现同一功能,展示了不同技术的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:有两个类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.youkuaiyun.com/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文件同上
结果同上

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值