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];
本篇文章翻译自苹果官方文档,有问题请评论,共勉~
来源:https://www.cnblogs.com/xinguan/p/3521491.html