ios基础之通告

通告就是一个对象将消息发给通告中心,然后通告中心又将此消息发送给感兴趣的对象。

每个运行中的程序都有一个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]);
}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值