通知

使用通知注意事项:

(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 添加 移除 解决问题

你可能感兴趣的:(通知)