NSNotification

NSNotification翻译为通知。继承于NSObject,遵守NSCoding、NSCopying、NSObject协议。

使用条件

在传值层数较多,或需要用到广播(一个发送,多人接收)的时候,可以选用通知。

实际例子:

鬼子进村了,村门口就一个大钟,有人去敲响,全村人就知道了,然后躲起来。

程序例子:

当用户登录成功以后,发个通知“登录成功了”,相应的用户个人中心、用户好友列表、只要和用户有关的数据,全都变了。

当用户注销登录以后,发出通知,相应的用户数据,相关页面就应该清除,或变成请登录。

使用方式

为了使用通知,我们来创建几个类,进行模拟用户登录的情况:

LoginViewController, UserCenterViewController, ModifyUserViewController,这些类都继承于NSObject

要完整的写一个通知,分为四个步骤:

  1. 发送通知;
  2. 接收通知;
  3. 接收到后做出相应处理;
  4. 移除通知

首先,在LoginViewController中,创建一个公开方法login,在方法中发出登录成功的通知:

  1. #import "LoginViewController.h"
  2. @implementation LoginViewController
  3. - (void)login {
  4. // 发送名为LoginSuccess的通知
  5. // 通过[NSNotificationCenter defaultCenter]单例获得通知中心对象
  6. // 调用postNotificationName:方法发出名为LoginSuccess的通知
  7. // object : 发送者,如果接受者不需要知道发送者是谁,可以传nil
  8. [[NSNotificationCenter defaultCenter] postNotificationName:@"LoginSuccess" object:nil];
  9. }
  10. @end

第二步,登录成功后,需要在UserCenterViewControllerModifyUserViewController中接收通知,并处理登录成功后的逻辑:

  1. #import "UserCenterViewController.h"
  2. @implementation UserCenterViewController
  3. // 重写init方法,让UserCenterViewController一初始化,就准备接收通知
  4. - (instancetype)init {
  5. self = [super init];
  6. if (self) {
  7. // 注册接收者与接收到以后,需要调用的方法
  8. // 参数1 Observer : 接受者(接收到后,谁来处理)
  9. // 参数2 selector : 接收到后,调用哪个方法来处理(接收到后,需要做什么)
  10. // 参数3 name : 要接收通知的名字
  11. // 参数4 object :
  12. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(loginSuccessNotification:) name:@"LoginSuccess" object:nil];
  13. }
  14. return self;
  15. }
  16. - (void)loginSuccessNotification:(NSNotification *)notification {
  17. NSLog(@"UserCenterViewController收到通知了");
  18. }
  19. @end

同样,ModifyUserViewController中的接收方式与UserCenterViewController相同,具体代码如下:

  1. #import "ModifyUserViewController.h"
  2. @implementation ModifyUserViewController
  3. - (instancetype)init {
  4. self = [super init];
  5. if (self) {
  6. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(loginSuccessNotification:) name:@"LoginSuccess" object:nil];
  7. }
  8. return self;
  9. }
  10. - (void)loginSuccessNotification:(NSNotification *)notification {
  11. NSLog(@"ModifyUserViewController收到通知了");
  12. }
  13. @end

最后一步,通知的移除。对于通知的接受者来说,当接受者释放之前,必须移除通知。对象声明周期的最后一步,就是dealloc方法,所以,通知的移除,一般写在dealloc中。

对于上面的例子来说,UserCenterViewControllerModifyUserViewController就需要移除通知。

  1. - (void)dealloc {
  2. [[NSNotificationCenter defaultCenter] removeObserver:self name:@"LoginSuccess" object:nil];
  3. [[NSNotificationCenter defaultCenter] removeObserver:self];
  4. }

具体分析