通告就是一个对象将消息发给通告中心,然后通告中心又将此消息发送给感兴趣的对象。
每个运行中的程序都有一个NSNotificationCenter的成员变量,功能类似于公告栏,对象注册关注某个确定的notification,这些注册对象称之为observer,其他的一些对象会给center发送notification,然后通告中心将该notification转发给所有注册对该notification感兴趣的对象吗,这些发送的对象称之为poster.
通告中心允许同一个程序的不同对象通信,它不能跨越不同的程序,其实通告机制就相当于设计模式中观擦者模式。Cocoa Touch基础框架提供了两个类对象来实现通告机制,分别是NSNotification和NSNotificationCenter。NSNotification对象非常简单,就是poster提供给observer的信息包裹,notification对象有两个重要的成员变量:name和object,一般object都是指向poster,在接收notification的时候可以回调poster。
NSNotification有两个方法:
-(NSSting *name);
-(id)object
NSNotificationCenter允许我们注册observer对象,发送notification,撤销observer对象注册:
常用方法:
+(NSNotificationCenter *)defaultCenter
返回单态实例,Cocoa Touch有很多对象都是通过类似方法实现。
-(void)addObserver:(id)anObserver Selector:(SEL)aselector Name:(NSString *)notificationName Object:(id)anObject
注册observer对象:接受对象名字为notificationName,发送者为anObject 的notification。当anObject发送notificationName的notification时,将会调用anObserver的aselector方法,参数该为notification。
如果notificationName为nil,那么通过中心将anObject发送的所有notification转发给observer。
如果observer为nil,那么通告中心将所有名字为notificationName的notification转发给observer。
-(void)postNotification:(NSNotification *)notification
上面的函数发送notification至通告中心。
创建并发送一个notification可以用下面的代码:
-(void)postNotificationName:(NSString * name)aName
Object:(id)anObject
移除observer:
-(void)removeObserver:(id)observer
下面是发送一个通告的示例代码:
//创建通告名字
NSString *myNotificationName=@"myNotification";
//获取通告中心
NSNotificationCenter *nc=[NSNotificationCenter defaultCenter];
//发送通告
[nc PostNotificationName :myNotificationName object:self];
要注册一个observer,必须提供几个参数:要成为observer的对象、所感兴趣的notification的名字以及当notification发送时要调用的方法,也可以指定关注某个对象的notification。
-(id)int{
Self =[super inti];
If(self!=nil){
NSNotificationCenter *center=[NotificationCenter defaultCenter];
[ nc addObserver:self Selector:@seletor(actionFunc:)Name:myNotificationName Object:nil]
}
return self;
}
在delloc中将移除observer对象可以使用以下代码:
-(void)dealloc{
NSNotificationCenter *nc=[NSNotificationCenter defaultCenter];
[nc removeObserver:self];
[super dealloc];
}
当notification发生时,处理actionFunc函数:
-(void)actionFunc:(NSNotification * )note{
NSlog(@"Received notification:%@",note);
}
notification对象的object变量时post而,如果我们想要notification对象传递更多的信息,我们可以使用user info dictionary。每个notification对象有一个变量叫userinfo,它是一个NSDiticitonary 对象,用来存放用户希望随着notification一起传递到observer的其他信息。
下面修改通告发送代码:
//创建通告的名字
NSSting * myNotificationName=@"myNotification";
//创建通告中心
NSNotificationCenter *nc=[NSNotificationCenter defaultCenter];
//创建参数子弹
NSDictionary *d=[NSDictionary dictionaryWithObject:@"object"forKey:@"key"];
//发送通告
[nc PostNotificationName :myNotificationName object:self userInfo:d];
//修改actionFun方法
-(void)actionFun:(NSNotification *note){
NSlog(@"Recevied notification :%@",note);
NSLog(@"Recevied notification param:%@",[[note userInfo]objectForKey:@ey]);
}