首页 > 代码库 > 【OC学习-34】通知NSNotification,类似于KVO,用于对象之间监听然后发通知提醒

【OC学习-34】通知NSNotification,类似于KVO,用于对象之间监听然后发通知提醒

通知其实和KVO类似,就是先在类A中设置通知,然后再类B中设置个监听这个通知的方法,当然可以通过这个通知方法可以传递一些参数,得到这个参数之后,一般是触发一个动作,此处举例就是触发输出一些内容而已。

(1)在Child类中初始化一个实例变量为100,每次递减2,当小于90时候触发通知。

//Child.h
#import <Foundation/Foundation.h>
@interface Child : NSObject
@property(nonatomic,assign)NSInteger sleep;
@end

//Child.m
#import "Child.h"

@implementation Child
-(id)init{
    self=[super init];
    if (self!=nil) {
        _sleep=100; //初始化为100
        [NSTimer timerWithTimeInterval:1 target:self selector:@selector(action:) userInfo:nil repeats:YES]; //设置一个定时器,把sleep递减
    }
    return self;
}
//下面就是递减的函数
-(void)action:(NSTimer *)timer{
    _sleep-=2;
    //当满足条件时,触发通知
    if (_sleep<90) {
        //设置的通知,名字叫helloname,object是一些参数,有时候发通知可能要随带的参数
        [[NSNotificationCenter defaultCenter]postNotificationName:@"helloname" object:[NSNumber numberWithInteger:_sleep]];
        [timer invalidate];//小于的时候通过发出去后停止这个定时器
    }
}
@end

(2)在类Parent中设置监听通知,如果监测到,则触发action方法定义的输出。

//Parent.m
#import "Parent.h"
#import "Child.h"

@implementation Parent
-(id)init{
    self=[super init];
    if (self!=nil) {
        //添加一个通知的监听
        [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(wakeMove:) name:@"helloname" object:nil];
    }
    return self;
}
-(void)wakeMove:(NSNotification *)notice{
    //你也可以把Child设置通知那里增加一个参数userInfo:dic后面跟一个字典或者什么,然后通过notice.userInfo传递过来输出一样可以
    NSNumber *num1=notice.object; //把在Child里定义通知时候的那个object传递过来
    NSLog(@"hold on the baby,%@",num1);
}
@end

(3)main.m

#import <Foundation/Foundation.h>
#import "Child.h"
#import "Parent.h"

int main(int argc, const char * argv[])
{
    @autoreleasepool {
        Child *child1=[[Child alloc]init];
        Parent *parent1=[[Parent alloc]init];
        [[NSRunLoop currentRunLoop]run];
        
    }
    return 0;
}

这个,呃,输出结果出现问题,但原因还不甚明了。

主要了解一下通知的概念以及用法,其实和KVO的思想类似。

这在项目开发中会用到。

【OC学习-34】通知NSNotification,类似于KVO,用于对象之间监听然后发通知提醒