美文网首页iOS Developer
NSNotificationCenter addObserver

NSNotificationCenter addObserver

作者: bigParis | 来源:发表于2017-04-21 16:57 被阅读605次

    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的移除的.

    相关文章

      网友评论

        本文标题:NSNotificationCenter addObserver

        本文链接:https://www.haomeiwen.com/subject/fycogttx.html