使用通知注意事项:
(1)接收通知前必须先移除掉通知,避免只发一次通知时,却出现两次或多次的响应事件;
(2)使用通知的类在被释放时,必须要移除通知;
(1)添加通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(respondsToNotification:) name:@"test0" object:_obj0];
_obj0是创建的一个实例,这里暂时不讨论object参数的用法。Observer即为响应者无需多说;selector即为一个响应通知的方法,需要SEL类型;name是一个标识,通知中心主要是通过它来实现消息的精确分发(当然object也有定位作用)。
(2)发送通知
//便利方法
[[NSNotificationCenter defaultCenter] postNotificationName:@"test0" object:_obj0 userInfo:@{@"key":@"_obj0"}];
//使用NSNotification
NSNotification *notification = [[NSNotification alloc] initWithName:@"test0" object:_obj2 userInfo:@{@"key":@"_obj2"}];
[[NSNotificationCenter defaultCenter] postNotification:notification];
发送通知和添加通知对应,需要name、object参数,这里多了一个userInfo,该参数可以把你需要携带的数据发送给该通知的响应者。
其实我们可以很轻易的想到,便利发送通知方法不过是对于使用NSNotification发送通知的一个语法糖,NSNotification才是消息体
(3)移除通知
//移除该响应者的全部通知
[[NSNotificationCenter defaultCenter] removeObserver:self];
//移除该响应者 name==@"test0" 的全部通知
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"test0" object:nil];
//移除该响应者 name==@"test0" 且 object==_obj0 的全部通知
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"test0" object:_obj0];
4、是否需要移除通知?
for (int i = 0; i < 3; i++) {
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(respondsToNotification:) name:@"test0" object:nil];
}
//该代码导致的结果是,响应通知回调会走三次。
可以看到,虽然我们在主线程中注册了通知的观察者,但在全局队列中post的Notification,并不是在主线程处理的。所以,这时候就需要注意,如果我们想在回调中处理与UI相关的操作,需要确保是在主线程中执行回调。
https://juejin.im/entry/5a8fe5c551882518c0797ebe
最后是把这个放在主线程中执行 解决了通知明明移除还多次发送的问题
不行…还是不行 最后在viewWillAppear viewWillDisappear 添加 移除 解决问题