NSNotification
notification的使用
注册观察者
- (void)addObserver:(id)notificationObserver selector:(SEL)notificationSelector name:(NSString *)notificationName object:(id)notificationSender
注意:
notificationObserver
不能为nilnotification Selector
回调方法有且只有一个参数(NSNotification
对象)- 如果
notificationName
为nil
,则会接收所有的通知(如果notificationSender
不为空,则接收所有来自于notificationSender
的所有通知) - 如果
notificationSender
为nil
,则会接收所有notificationName
定义的通知;否则,接收由notificationSender
发送的通知 - 监听同一条通知的多个观察者,在通知到达时,它们执行回调的顺序是不确定的
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的使用