设计模式--通知中心(广播设计模式)
2017-10-20 本文已影响51人
Cy_Star
1、通知中心(NSNotificationCenter)
通知中心 :任意一个发送者可以发送 消息/广播 给任意一个接收者(听众),
这就是通知中心的一个主要作用
(如:需要在多个页面/对象 传递参数,通知中心就是其中一种传递方式)
2、创建通知中心
//1、取得通知中心
NSNotificationCenter * nc = [NSNotificationCenter defaultCenter];
3、发送消息(NSNotification)
-(void)looper;
- (void) inform_center;
-(void)looper
{
// 启动一个定时器 循环发送广播
[NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(inform_center) userInfo:nil repeats:YES];
}
- (void) inform_center
{
//1、取得通知中心
NSNotificationCenter * nc = [NSNotificationCenter defaultCenter];
//2、时间戳,做定时循环广播
static int i;
NSString * count = [NSString stringWithFormat:@"Audience %d",i++];
NSDictionary * dic = [NSDictionary dictionaryWithObjectsAndKeys:@"Inform_center", @"name", count, @"Value", nil];
//消息内容
//1、发送广播
[nc postNotificationName:@"Inform" object:self userInfo:dic];
/*
可获取的方法
name:(NString *) -- 通知中心消息的名字,带着参数object:
object:(id) 消息的对象
userInfo:(NSDictionary) 消息中可以带的参数
*/
}
4、接收消息(NSNotification)
// 接收消息是一个回调机制,要注册接收哪个消息,
如果这个消息得到了响应,在对象当中就能够回调接收消息的方法
-(void) Listen;
-(void) Listen
{
//1、注册
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(recvIform:) name:@"Inform" object:nil];
/* \ 只要是这个广播:(name:@"Inform"),addObserver: self 就调用
selector: (recvIform:)这个方法,
addObserver:self selector:@selector(recvIform:) == [self recvIform];
object: 一般都设为nil,这样就等于不用指定的广播站就可以收听 “Iform” 这个频段的广播
注意:name:@"Inform" 必须跟 [nc postNotificationName:@"Inform" object:self userInfo:dic]; 的 postNotificationName:@"Inform"保持一致,
可以说是发送频道跟接收频道保持一致才能互通,听众才可以听到广播发出的通知。
*/
}
//2、接收广播数据
-(void)recvIform:(NSNotification *) nc{
//nc : 具体的广播消息
NSString * name = nc.name;
NSLog(@"name is %@",name);
NSLog(@"nc is %@",nc);
}
5、使用
// 创建广播站
Inform * inf = [[Inform alloc]init];
[inf looper]; // 调用循环的广播
//听众
Audience * aud = [[Audience alloc]init];
[aud Listen];//听广播
[[NSRunLoop currentRunLoop] run];
//
输出接收到的消息.png