一、通知的添加
通知的添加有两种常用的方式:
方式一:
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(receiceNotification:)
name:@"JKRNO"
object:nil];
addObserver:接收通知的对象
selector:接收通知的对象接收到通知调用的方法
name:通知的名字
object:接收哪个对象发送的通知
方式二:
@property (nonatomic, strong) NSObject *observer;
...
self.observer = [[NSNotificationCenter defaultCenter]
addObserverForName:@"JKRSEC"
object:self
queue:[NSOperationQueue new]
usingBlock:^(NSNotification * _Nonnull note) {
/// 接收到通知回调的block
}];
返回值:通知实际添加到的observer,移除通知要移除这个对象
name参数:通知的名字
object:接收哪个对象发送的通知
queue:接收到通知的回调在哪个线程中调用,如果传mainQueue则通知在主线程回调,否则在子线程回调
usingBlock:接收到通知回调的block
️方式一的声明方法,addObserver参数就是实际给哪个对象添加通知。而方式二方法,实际是给通知声明方法的返回值添加通知。
二、通知的移除
方式一
- (void)addObserver:(id)observer selector:(SEL)aSelector name:(nullable NSNotificationName)aName object:(nullable id)anObject;
方法声明的通知在iOS9.0之后是不用手动移除的,当被添加通知的对象销毁的时候,通知会自动被移除。
Description
如果在iOS9.0之前则还需要对被添加通知的销毁方法中移除通知:
- (void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
方式二
- (id )addObserverForName:(nullable NSNotificationName)name object:(nullable id)obj queue:(nullable NSOperationQueue *)queue usingBlock:(void (^)(NSNotification *note))block NS_AVAILABLE(10_6, 4_0);
通过这个方式添加的通知,是比较不一样的,首先它不会自动移除,其次,它的移除需要调用该方法返回的对象去移除,这就是为什么上面提到的这个添加方法的时候,会特别创建了一个属性来持有这个方法的返回参数。
@property (nonatomic, strong) NSObject *observer;
...
self.observer = [[NSNotificationCenter defaultCenter]
addObserverForName:@"JKRSEC"
object:nil queue:[NSOperationQueue new]
usingBlock:^(NSNotification * _Nonnull note) {
NSLog(@"%@", [NSThread currentThread]);
}];
...
- (void)dealloc {