NSNotification

notification的使用

注册观察者

- (void)addObserver:(id)notificationObserver selector:(SEL)notificationSelector name:(NSString *)notificationName object:(id)notificationSender

注意:

  1. notificationObserver不能为nil
  2. notification Selector回调方法有且只有一个参数(NSNotification对象)
  3. 如果notificationNamenil,则会接收所有的通知(如果notificationSender不为空,则接收所有来自于notificationSender的所有通知)
  4. 如果notificationSendernil,则会接收所有notificationName定义的通知;否则,接收由notificationSender发送的通知
  5. 监听同一条通知的多个观察者,在通知到达时,它们执行回调的顺序是不确定的

post通知

[[NSNotificationCenter defaultCenter] postNotificationName:@"First" object:@"博客园-Fly_Elephant"];
-(void)notificationFirst:(NSNotification *)notification{
    NSString  *name=[notification name];
    NSString  *object=[notification object];
    NSLog(@"名称:%@----对象:%@",name,object);
}
//名称:First----对象:博客园-Fly_Elephant

[[NSNotificationCenter defaultCenter] postNotificationName:@"Second" object:@"http://www.cnblogs.com/xiaofeixiang" userInfo:dict];
-(void)notificationSecond:(NSNotification *)notification{
    NSString  *name=[notification name];
    NSString  *object=[notification object];
    NSDictionary  *dict=[notification userInfo];
    NSLog(@"名称:%@----对象:%@",name,object);
    NSLog(@"获取的值:%@",[dict objectForKey:@"key"]);
}
//名称:Second----对象:http://www.cnblogs.com/xiaofeixiang
//获取的值:keso

通知原理

单例的方式创建一个NSNotificationCenter对象
对象注册观察者时 将注册的name selector object 作为一个模型 添加到一个数组中

post时根据名字和object 找到数组中注册的对象 执行通知的方法

多线程

在多线程应用中,Notification在哪个线程中post,就在哪个线程中被转发,而不一定是在注册观察者的那个线程中。
也就是说,Notification的发送与接收处理都是在同一个线程中.

通告队列 NSNotificationQueue

NSNotificationQueue 作用是充当通告中心(NSNotificationCenter)的缓冲区,以FIFO的顺序进行维护。当一个通告上升到队列最前时,就将他发送给通告中心,通告中心随后将它派发给所有注册为观察者的对象

参考NSNotification&NSNotificationCenter(实现原理,多线程,内存管理角度)
参考iOS NSNotification的使用