现在的位置: 首页 > 综合 > 正文

iOS 通知中心的使用

2018年01月10日 ⁄ 综合 ⁄ 共 2610字 ⁄ 字号 评论关闭


初学通知中心模块的时候,由于老师说通知中心相比于代理模式要简单很多,故而增加了我对通知消息机制的不重视心理,一心学好代理,后来感觉代理学的还可以了,回头一看,通知中心的东西,虽然一直都有在用,但是原理都忘光了.现在一想,满眼都是泪啊. 所以,今天花了N些时间,把NSNotificationCenter又好好的过了一遍.
其实,通知机制简单不过,只需要掌握三个过程:
通知的监听 
通知的发布
通知的移除

每一个应用程序都有一个通知中心(NSNotificationCenter)实例,专门负责协助不同对象之间的消息通信
任何一个对象都可以向通知中心发布通知(NSNotification),描述自己在做什么。其他感兴趣的对象(Observer),或者说观察者都可以申请在某个特定通知发布时(或在某个特定的对象发布通知时)收到这个通知.消息发送者和消息接受者两者可以互相一无所知,完全解耦。
这种消息通知机制可以应用于任意时间和任何对象,观察者可以有多个,所以消息具有广播的性质,所有很多人也把通知中心叫做广播站.只是需要注意的是,观察者向消息中心注册以后,在不需要接受消息时需要向消息中心注销,这种消息广播机制是典型的“Observer”观察者模式。



消息机制常常用于在向服务器端请求数据或者提交数据的场景,在和服务器端成功交互后,需要处理服务器端返回的数据,或发送响应消息等,就需要用到消息机制。当然,通过block的方式处理服务器端返回的数据也是常用的手段之一,在注册监听者的时候通知中心就是利用block来处理返回的数据,并且通过queue决定block在哪个操作队列中执行,如果传nil,默认在当前操作队列中同步执行.
一个完整的通知NSNotification一般包含3个属性:

- (NSString *)name; // 通知的名称
- (id)object; // 通知发布者(是谁要发布通知)
- (NSDictionary *)userInfo; // 一些额外的信息(通知发布者传递给通知接收者的信息内容)
初始化一个通知(NSNotification)对象
+ (instancetype)notificationWithName:(NSString *)aName object:(id)anObject;
+ (instancetype)notificationWithName:(NSString *)aName object:(id)anObject userInfo:(NSDictionary *)aUserInfo;
- (instancetype)initWithName:(NSString *)name object:(id)object userInfo:(NSDictionary *)userInfo;

 当然,在我们完成整个通知机制的时候,并不需要使用到以上3个方法.

使用通知机制的步骤:

1.观察者注册消息通知:
 // 拿到通知中心对象
NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
// 收听新闻, 添加监听器
[center addObserver:self selector:@selector(newsCome:) name:nil object:nil];
[center addObserver:self selector:@selector(newsCome:) name:@"yule_news" object:tx];

  1. notificationObserver 观察者 : self
  2. notificationSelector 处理消息的方法名: newsCome:
  3. notificationName 消息通知的名字: yule_news
  4. notificationObject消息发送者 : 表示接收哪个发送者的通知,如果第四个参数为nil,接收所有发送者的通知

当然观察者注册通知时OC中还提供了一种更为灵活且全面的方法:

- (id)addObserverForName:(NSString *)name object:(id)obj queue:(NSOperationQueue *)queue usingBlock:(void (^)(NSNotification *note))block;
  1. name:通知的名称
  2. obj:通知发布者
  3. block:收到对应的通知时,会回调这个block
  4. queue:决定了block在哪个操作队列中执行,如果传nil,默认在当前操作队列中同步执行

2.发送者发送消息通知:
// 在不同的类中要首先拿到通知中心单例对象
NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
[center postNotificationName:@"junshi_news" object:tx userInfo:@{@"title" : @"巴以冲突", @"text" : @"巴以冲突升级。。。。。"}];        
[center postNotificationName:@"yule_news" object:sina userInfo:@{@"title" : @"xx星吸毒被抓", @"text" : @"xx星吸毒被抓...."}];
需要注意的是,从逻辑上来说,观察者的注册是要在发送者发送通知之前实现的(比如TX在8点发了一条通知,而你在9点再去注册监听,接收通知,那么8点的这条通知你永远也接收不到.).
所以在接收到通知消息后,观察者在此处理消息:
- (void) newsCome:(NSNotification*) aNotification
{
<span style="white-space:pre">	</span>NSLog(@"我收到了这条消息");
}

3.观察者的注销,移除掉通知消息观察者

- (void)dealloc
{
//    [super dealloc];//在非ARC中调用
    // 把人监听的所有通知都移除掉
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

需要特别注意的是:
通知中心不会保留(retain)监听器对象,在通知中心注册过的对象,必须在该对象释放前取消注册。否则,当相应的通知再次出现时,通知中心仍然会向该监听器发送消息。因为相应的监听器对象已经被释放了,所以可能会导致应用崩溃.

抱歉!评论已关闭.