• iOS通知线程处理


    准备

    测试项目中点击ViewController界面跳转到SecondTestViewController中,再点击SecondTestViewController时返回到ViewController,并且将ViewController中一个view的背景颜色设置为红色。

    代码示例:

    • 通知发送点在主线程中的时候接收调用的方法也在主线程执行
    //发送位置 SecondTestViewController
    [[NSNotificationCenter defaultCenter] postNotificationName:NOTIFICATION_NAME object:nil userInfo:nil];
        NSLog(@"当前线程 发送 %@", [NSThread currentThread]);
        [self.navigationController popViewControllerAnimated:YES];
        
    //接收位置ViewController
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleNotification:) name:NOTIFICATION_NAME object:nil];
    - (void)handleNotification:(NSNotification *)notification
    {
        self.changeView.backgroundColor = [UIColor redColor];
        NSLog(@"当前线程 设置背景  %@", [NSThread currentThread]);
    }
    //输出
    当前线程 设置背景  <NSThread: 0x60c0000750c0>{number = 1, name = main}
    当前线程 发送 <NSThread: 0x60c0000750c0>{number = 1, name = main}
    
    
    • 通知发送在global时,经测试其在同一线程
    //发送点
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            NSLog(@"当前线程 发送 %@", [NSThread currentThread]);
            [[NSNotificationCenter defaultCenter] postNotificationName:NOTIFICATION_NAME object:nil userInfo:nil];
        });
        
    //接收点
    	self.changeView.backgroundColor = [UIColor redColor];
        NSLog(@"当前线程 设置背景  %@", [NSThread currentThread]);
        
    //输出
    当前线程 发送 <NSThread: 0x6080004632c0>{number = 3, name = (null)}
    当前线程 设置背景  <NSThread: 0x6080004632c0>{number = 3, name = (null)}
    //同时在接收点提示警告“-[UIView setBackgroundColor:] must be used from main thread only”
        
    
    • 我们创建一个子线程让其中发送通知
    //发送
     dispatch_queue_t queue = dispatch_queue_create("sss", DISPATCH_QUEUE_SERIAL);
        dispatch_async(queue, ^{
            NSLog(@"当前线程 发送 %@", [NSThread currentThread]);
            [[NSNotificationCenter defaultCenter] postNotificationName:NOTIFICATION_NAME object:nil userInfo:nil];
        });
        
    //接收
    	self.changeView.backgroundColor = [UIColor redColor];
        NSLog(@"当前线程 设置背景  %@", [NSThread currentThread]);
        
    //输出
    当前线程 发送 <NSThread: 0x608000078900>{number = 3, name = (null)}
    当前线程 设置背景  <NSThread: 0x608000078900>{number = 3, name = (null)}
    //同时在接收点提示警告“-[UIView setBackgroundColor:] must be used from main thread only”
    

    官方文档:在多线程的程序中,通知会在post通知时所在的线程被传达,这就导致了观察者注册通知的线程和收到通知的线程不在一个线程。

    总结:通过上面的示例可以初步得出结论Notification的发送处理一般在同一线程,所以当我们在子线程发送了通知后在接收端如果涉及到UI操作的部分不要忘记返回到主线程后再进行UI操作。

    如有错误,欢迎拍砖

  • 相关阅读:
    shi_tomasi特征点,GFTTDetector
    特征点总结(按features2d.hpp源码由上至下总结)
    经过一年时间的沉淀 再次回首 TCP Socket服务器编程 (二)
    构建嵌入式小型Linux系统
    老赵书托(3):深入理解计算机系统
    #define与typedef区别
    Linux下快速静态编译Qt以及Qt动态/静态版本共存
    tcpdump示例
    linux绑定多个ip(转载)
    Linux下eclipse及mysql安装,c++访问mysql数据库
  • 原文地址:https://www.cnblogs.com/GoodmorningMr/p/9661213.html
Copyright © 2020-2023  润新知