objective c设计模式--通知中心

通知中心
通知中心就是让任意一个消息的发送者可以将消息发送给任意一个消息的接收者。
创建通知中心:
通知中心是个单例, NSNotificationCenter *center = [NSNotificationCenter  defaultCenter];
通知中心要发送消息,消息也是对象,消息的类型:

@interfaceNSNotification :NSObject<NSCopying,NSCoding]] > - (NSString*)name; 

- (id)object; - (NSDictionary*)userInfo; @end

发送消息:

- (void)postNotification:(NSNotification*)notification; 

- (void)postNotificationName:(NSString*)aName object:(id)anObject;

- (void)postNotificationName:(NSString *)aName object:(id)anObject userInfo:(NSDictionary *)aUserInfo;
 a, postNotificationName,推送消息的名称,匹配在注册消息监听者时的消息名称。
 b, object, 发送消息的实例
 c, userInfo,发送消息时附带的消息上下文,此实例为一个字典实例 
接受消息:
- (void)addObserver:(id)observer selector:(SEL)aSelector name:(NSString *)aName object:(id)anObject;
a, addObserver,添加监听者实例,此处为当前实例

 b,  selector,observer中的一个方法指针,当有消息的时候会执行此方法,并把相关上下文以参数传递过去
 c, name,注册所关心消息的名称,
 d, object,这个是对消息发送方的一个过滤,此参数据说明当前监听器仅对某个对象发出的消息感兴趣。

下面有一份实例:下面有一份实例:用广播电台与听众举个例子,听众需要先调好频道(好比用(void)addObserver:(id)observer selector:(SEL)aSelector name:(NSString *)aName object:(id)anObject;方法在消息中心注册一样),然后广播电台发送消息(好比消息中心调用- (void)postNotificationName:(NSString *)aName object:(id)anObject userInfo:(NSDictionary *)aUserInfo;方法一样),可以通过(SEL)aSelector方法执行想要的操作。


BJBroadCast.h

#import<Foundation/Foundation.h>

@interfaceBJBroadCast :NSObject 

- (void) boardcast; -(void) boardcastLooper;

@end


BJBroadCast.m

#import"BJBroadCast.h"

@implementationBJBroadCast 

-(void) boardcastLooper {      [NSTimerscheduledTimerWithTimeInterval:1.0ftarget:selfselector:@selector(boardcast)userInfo:nilrepeats:YES];    //启动一个定时器循环发送广播

- (void) boardcast {    //1.取得通知中心,是个单例     

   NSNotificationCenter*center = [NSNotificationCenterdefaultCenter];    //消息的内容

   staticint  i ;

    NSString*count = [NSStringstringWithFormat:@"boardcast %d",i++];

    NSDictionary*dict = [NSDictionarydictionaryWithObjectsAndKeys:@"boardcast",@"Name",count,@"Value",nil];    //2.发送广播         [centerpostNotificationName:@"BJboardcast"object:selfuserInfo:dict];

 }

@end


listener.h

#import<Foundation/Foundation.h>

@interfacelistener :NSObject 

-(void) wanttolisten; 

@end

listener.m

#import"listener.h"

@implementationlistener 

-(void) wanttolisten {    //1.要先注册     [[NSNotificationCenterdefaultCenter]addObserver:selfselector:@selector(recieveBoardcast:)name:@"BJboardcast"object:nil];    //第一个、第二个参数表示只要有@"BJboardcast"这个广播,就调用[self recieveBoardcast:];第四个参数一般都设为nil    // 2.接受广播数据        } 

- (void) recieveBoardcast:(NSNotification*)notify {    //notify就是具体的广播的消息

   NSString*name = notify.name;

    NSLog(@"notify is %@",notify);

 }

@end


main.m

#import<Foundation/Foundation.h>

#import"BJBroadCast.h" 

#import"listener.h"

int main () {

    @autoreleasepool{

        listener*l1 = [[listeneralloc]init];

         [l1wanttolisten];

        listener*l2 = [[listeneralloc]init];

         [l2wanttolisten];

        BJBroadCast*cast = [[BJBroadCastalloc]init];

         [castboardcastLooper];        //要先创建收听者,再创建波段频道,否则,就需要使用boardcastLooper方法。         [[NSRunLoopcurrentRunLoop]run];

    } 

       return0;

 }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值