通知其实和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的思想类似。
这在项目开发中会用到。
时间: 2024-10-22 07:58:14