iOS开发系列--通知与消息机制详解

2020-01-18 17:10:15于丽

 

NSNotification:代表通知内容的载体,主要有三个属性:name代表通知名称,object代表通知的发送者,userInfo代表通知的附加信息。

虽然前面的文章中从未提到过通知中心,但是其实通知中心我们并不陌生,前面文章中很多内容都是通过通知中心来进行应用中各个组件通信的,只是没有单独拿出来说而已。例如前面的文章中讨论的应用程序生命周期问题,当应用程序启动后、进入后台、进入前台、获得焦点、失去焦点,窗口大小改变、隐藏等都会发送通知。这个通知可以通过前面NSNotificationCenter进行订阅即可接收对应的消息,下面的示例演示了如何添加监听获得UIApplication的进入后台和获得焦点的通知:


//
// KCMainViewController.m
// NotificationCenter
//
// Created by Kenshin Cui on 14/03/27.
// Copyright (c) 2014年 cmjstudio. All rights reserved.
//

#import "KCMainViewController.h"

@interface KCMainViewController ()

@end

@implementation KCMainViewController

- (void)viewDidLoad {
  [super viewDidLoad];
  
  [self addObserverToNotificationCenter];
  
}

#pragma mark 添加监听
-(void)addObserverToNotificationCenter{
  /*添加应用程序进入后台监听
   * observer:监听者
   * selector:监听方法(监听者监听到通知后执行的方法)
   * name:监听的通知名称(下面的UIApplicationDidEnterBackgroundNotification是一个常量)
   * object:通知的发送者(如果指定nil则监听任何对象发送的通知)
   */
  [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationEnterBackground) name:UIApplicationDidEnterBackgroundNotification object:[UIApplication sharedApplication]];
  
  /* 添加应用程序获得焦点的通知监听
   * name:监听的通知名称
   * object:通知的发送者(如果指定nil则监听任何对象发送的通知)
   * queue:操作队列,如果制定非主队线程队列则可以异步执行block
   * block:监听到通知后执行的操作
   */
  NSOperationQueue *operationQueue=[[NSOperationQueue alloc]init];
  [[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationDidBecomeActiveNotification object:[UIApplication sharedApplication] queue:operationQueue usingBlock:^(NSNotification *note) {
    NSLog(@"Application become active.");
  }];
}

#pragma mark 应用程序启动监听方法
-(void)applicationEnterBackground{
  NSLog(@"Application enter background.");
}
@end

当然很多时候使用通知中心是为了添加自定义通知,并获得自定义通知消息。在前面的文章“iOS开发系列--视图切换”中提到过如何进行多视图之间参数传递,其实利用自定义通知也可以进行参数传递。通常一个应用登录后会显示用户信息,而登录信息可以通过登录界面获取。下面就以这样一种场景为例,在主界面中添加监听,在登录界面发送通知,一旦登录成功将向通知中心发送成功登录的通知,此时主界面中由于已经添加通知监听所以会收到通知并更新UI界面。