addObserverForName这个方法并不常用, 但估计很多人和我一样, 最开始的时候也不太了解这个方法, 再看了网上的一些技术贴, 更是对addObserverForName产生了误解.
应用场景
当通知的发出不在主线程, 但是发出的通知需要更新UI, 就可能会用到这个方法.
- (id <NSObject>)addObserverForName:(nullable NSNotificationName)name
object:(nullable id)obj
queue:(nullable NSOperationQueue *)queue
usingBlock:(void (^)(NSNotification *note))block NS_AVAILABLE(10_6, 4_0);
// The return value is retained by the system, and should be held onto by the caller in
// order to remove the observer with removeObserver: later, to stop observation.
这里我把苹果爸爸的注释也copy上了, 意思, 是使用者要持有addObserverForName的返回值, 也就是持有这个observer, 后面需要通过removeObserver来停止监听. 但实际使用中, 我们会发现, addObserverForName并不需要caller去持有这个observer, 只需要在block中使用weak, 系统就会在dealloc中帮我们去remove这个observer.
__weak typeof(self) weak_self = self;
[[NSNotificationCenter defaultCenter] addObserverForName:fuckDogNotification
object:nil
queue:[NSOperationQueue mainQueue]
usingBlock:^(NSNotification *note) {
[weak_self beginFuckDogs];
}];
有些同学可能并不知道系统会帮我们remove这个情况, 还是会在dealloc中去无脑调用一次[[NSNotificationCenter defaultCenter] removeObserver:self];
但是我们应该知道[[NSNotificationCenter defaultCenter] removeObserver:self];
应该是用于普通的addObserver
的移除的.
网友评论