OC基础-设计模式之通知中心(广播)

一、概念

通知中心NSNotificationCenter,也就是广播,和java类似。消息发送者通过通知中心将消息发送给消息接受者。通知中心是一个单例。

相关的二个类:

NSNotificationCenter:消息中心,负责消息的发送和消息的接收,是单例。

NSNotification:消息,可以包含消息的各种信息。


二、消息的发送和消息的接收

1.消息类型

通知中心发送的消息是一个类NSNotification的对象,一个消息对象包含的内容:

@interface NSNotification: NSObject
 -(NSString *) name;//获得消息的名字
 -(id)object;   //消息的对象
 -(NSDictionary *)userinfo;//消息的参数
 @end
2.发送消息

发送消息有三种方法:

-(void)postNotification: (NSNotification *)notification;
 -(void)postNotificationName:(NSString *)aName object:(id)anObject;
 -(void)postNtificationName:(NSString *)aName object:(id)anObject  userinfo: (NSDictionary *)aUserinfo;

我们可以根据情况选择一种方法来发送消息。

3.消息的接收

-(void)addObserver: (id)observer selector:(SEL)aSekector name:(NSString *)aName object:(id)anObject;
消息的接收是一种回调机制,接收消息需要先于发送消息之前注册,在发送消息之前,我们需要先注册广播接受者,这样发送的消息才能被接收到。


三、通知中心使用示例

1.创建BJBroadcast类,在该类中执行发送广播的操作。

BJBroadcast.h

#import 

@interface BJBroadcast : NSObject

//发送广播
-(void)broadcast;

//循环发送广播
-(void)broadcastLooper;
@end

BJBroadcast.m

#import "BJBroadcast.h"

@implementation BJBroadcast

//发送广播
-(void)broadcast{
    //1.取得通知中心
    NSNotificationCenter * center = [NSNotificationCenter defaultCenter];
    //2.编辑消息参数
    static int i;
    NSString * count = [NSString stringWithFormat:@"broadcast %d",i++];
    NSDictionary * dict= [NSDictionary dictionaryWithObjectsAndKeys:@"beijing broadcast", @"name", count, @"time", nil];
    //3.发送广播
    //形式1:
//    NSNotification * notif = [[NSNotification alloc] initWithName:@"BJBroadcast" object:self userInfo:dict];
//    [center postNotification:notif];
    
    //形式2:
    //[center postNotificationName:@"BJBroadcast" object:self];
    
    //形式3:
    [center postNotificationName:@"BJBroadcast" object:self userInfo:dict];
}
//设置一个定时器,循环发送广播
-(void)broadcastLooper{
    [NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(broadcast) userInfo:nil repeats:YES];
    /*
     参数1:间隔时长
     参数2:目标
     参数3:执行的代码
     参数4:用户信息
     参数5:是否循环
     */
}

@end
2.创建AListener类,在该类中执行接收广播的操作

AListener.h

#import 

@interface AListener : NSObject

-(void)wantToListen;
@end

AListener.m

#import "AListener.h"

@implementation AListener

//接收广播信息
-(void)receiveBroadcast: (NSNotification *)notification{
    NSString * name = notification.name;
    NSLog(@"%@", notification);
    NSLog(@"广播名称:%@", name);
}

//监听器,监听广播
-(void)wantToListen{
    NSNotificationCenter * center = [NSNotificationCenter defaultCenter];
    [center addObserver:self selector:@selector(receiveBroadcast:) name:@"BJBroadcast" object:nil];
    
    //只要有广播,就调用[self receiveBroadcast]
    //因为这里,广播的接收会有参数,所以selector的方法为receiveBroadcast:
}


@end
3.在main函数中调用接收广播的函数和发送广播的函数

#import 
#import "BJBroadcast.h"
#import "AListener.h"


int main(int argc, const char * argv[]) {
    @autoreleasepool {
        BJBroadcast * bjcast = [[BJBroadcast alloc] init];
        AListener * listener = [[AListener alloc] init];
        
        //先注册监听器
        [listener wantToListen];
        
        //然后发送广播。必须先注册监听器再发送广播才能接收到消息。
        //发一次广播
        //[bjcast broadcast];
        //循环发广播
        [bjcast broadcastLooper];
        //使得线程表现得更好,有事件时唤醒线程,没事件时休眠。
        [[NSRunLoop currentRunLoop] run];
    }
    return 0;
}
广播是非常有用的一种设计模式,比如在开发app一款购物类app时,我们需要再多个页面都能即时的修改购物车的产品数量,这时可以使用该机制,在购物车类中注册广播接受者,接收其它页面发送的关于购物车产品数量的消息,实时修改购物车产品的数目。

@诗未冷学习博客

你可能感兴趣的:(OC基础)