IOS消息机制-NSNotification与NSNotificationCenter

自作多情 提交于 2020-03-30 03:08:51


  IOS的消息机制其实是观察者模式的一个实践。你对某个事件感兴趣,那就就去注册成为他的观察者,这样当这个事件发生时就会收到人家的通知啦,就这么简单。还记得我们在《IOS之MVC》中说过,model不能直接调用controller,但是可以通过某种特殊的手段,间接的告诉controller去干什么,从而达到调用的目的。通过发送消息可以达到代码的彻底解耦。

  消息机制的主要流程是:
  

  与notification相关的类及方法使用:

NSNotification
  NSNotification封装了一些信息是的通过NSNotificationCenter发送消息的时候可以携带一些额外的信息。一个NSNotification对象包括一个name,object和一个额外的dictionary。name是用来标识一个消息的tag,object是消息的发送者想告诉消息接受者的一个对象(通常是消息的发送者),而dic存储了一些消息相关的信息。NSNotification是不可变的对象。
  你可以通过下面的这些方法创建一个NSNotification对象:
  
+ notificationWithName:object:
  + notificationWithName:object:userInfo:
  – initWithName:object:userInfo:
  - name
  - object
  - userInfo

  然而,通常你并不需要直接建立一个NSNotification对象,因为NSNotificationCenter提供了可以直接发送消息的方法。另外,NSNotification class实现了NSCopying协议,因此NSNotification可以被复制和重复使用。你可以存储notification以便后续使用或者将其发送给另外的线程。

NSNotificationCenter
  NSNotificationCenter对象(简称消息中心)提供应用程序广播消息的一种机制。NSNotificationCenter对象实际上是一种消息的调度中心。对象首先通过以下方法注册成为消息中心的观察者,这样就能接收到消息中心的消息。每一个运行的应用程序都有一个默认的消息中心,即default notification center。
  首先,获取到消息中心的实例:
  + defaultCenter
  注册成为消息中心的观察者:
  - addObserverForName:object:queue:usingBlock:
  
- (id)addObserverForName:(NSString *)name object:(id)obj queue:(NSOperationQueue *)queue usingBlock:(void (^)(NSNotification*))block
  name : 用于区分消息的tag,只有接收到带这个name的消息时block才会被加入到queue里面去
  obj : 用于区分消息发送者的标志,只有接收到该对象发送来的消息时,才是你想要接收的消息,block才会被加入到queue里去
  queue : block被加入到的queue,如果你传入nil,block将在消息发送者的线程里同步执行
  block : 当接收到消息时要执行的block,block被消息中心拷贝并持有知道消息注册的关系被remove掉。该block有一个参数是notification消息本身。

1 NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
2 NSOperationQueue *mainQueue = [NSOperationQueue mainQueue];
3 self.localeChangeObserver = [center addObserverForName:NSCurrentLocaleDidChangeNotification object:nil
4     queue:mainQueue usingBlock:^(NSNotification *note) {
5  
6         NSLog(@"The user's locale changed to: %@", [[NSLocale currentLocale] localeIdentifier]);
7     }];

  - addObserver:selector:name:object:
  - (void)addObserver:(id)notificationObserver   selector:(SEL)notificationSelector    name:(NSString *)notificationName   object:(id)notificationSender
  
notificationObserver : 注册成为观察者的对象,参数不能为nil
  notificationSelector : 消息的接受者接收到消息后要执行的方法,该方法必须有一个参数,参数是一个NSNotification的对象
  notificationName : 注册观察者的消息的名称,只有该名称的消息会发送给观察者,如果你传入nil,消息中心将不能通过name去决定是否要发送消息给该观察者
  notificationSender : 观察者想要接收的消息的发送方对象,意味着只有该对象发送的消息会被分发给观察者
  一定要记住,当任何观察者被释放前,务必调用下面的方法去移除观察。

  移除观察者
  - removeObserver:
  - removeObserver:name:object:
  - (void)removeObserver:(id)notificationObserver name:(NSString *)notificationName object:(id)notificationSender
  notificationObserver : 将要移除的观察者,指定要移除的观察者
  notificationName : 将要移除的观察的消息name,指定要移除的消息的name
  notificationSender : 要移除的发送者对象,指定移除发送自该对象的消息
  发送消息:
  - postNotificationName:object:
  - postNotificationName:object:userInfo:

[[NSNotificationCenter defaultCenter] postNotificationName:@"Notification For Example" object:userProfile userInfo:nil];

 

本篇文章翻译自苹果官方文档,有问题请评论,共勉~

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!