通知其实和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的思想类似。
这在项目开发中会用到。