zoukankan      html  css  js  c++  java
  • NSNotificationCenter 注册和移除的规范代码

    在我们开发中,我们经常可以看到这样的代码:

    - (void)viewWillAppear:(BOOL)animated
    {
        [super viewWillAppear:animated];
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(test) name:@"test" object:nil];
    }
    
    - (void)viewWillDisappear:(BOOL)animated
    {
        [super viewWillDisappear:animated];
        [[NSNotificationCenter defaultCenter] removeObserver:self name:@"test" object:nil];
    }

    就是在页面出现的时候注册通知,页面消失时移除通知。你这边可要注意了,一定要成双成对出现,通过指定的 name 移除通知,如果你只在viewWillAppear 中 addObserver没有在viewWillDisappear 中 removeObserver那么当消息发生的时候,你的方法会被调用多次。

    正确的多线程通知发送和接收

    NSNotificationCenter消息的接受线程是基于发送消息的线程的。也就是同步的,因此,有时候,你发送的消息可能不在主线程,而大家都知道操作UI必须在主线程,不然会出现不响应的情况。所以,在你收到消息通知的时候,注意选择你要执行的线程。下面看个示例代码

    //接受消息通知的回调
    - (void)test
    {
        if ([[NSThread currentThread] isMainThread]) {
            NSLog(@"main");
        } else {
            NSLog(@"not main");
        }
    
        dispatch_async(dispatch_get_main_queue(), ^{
            //do your UI
        });
    
    }
    
    //发送消息的线程
    - (void)sendNotification
    {
        dispatch_queue_t defaultQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
        dispatch_async(defaultQueue, ^{
        [[NSNotificationCenter defaultCenter] postNotificationName:@"test" object:nil];
      });
    }                

    总结

    代码一定要养成良好的习惯,该移除的还是要移除。

  • 相关阅读:
    Centos 8 部署harbor 访问502
    selenium学习记录
    shell基础
    抓取人民日报
    caffe在笔记本ubuntu10.04 64位下的无GPU安装
    【转】HMM
    typedef 的一些用法
    j2ee 使用tomcat开发网站需要访问中文名的资源遇到的问题解决方案。。
    解决lex.yy.c文件在vs2012下编译生成exe
    python学习
  • 原文地址:https://www.cnblogs.com/allanliu/p/5309964.html
Copyright © 2011-2022 走看看