美文网首页
dispatch_queue_async_safe 与 disp

dispatch_queue_async_safe 与 disp

作者: 镜像 | 来源:发表于2021-02-22 17:22 被阅读0次
#ifndef dispatch_queue_async_safe
#define dispatch_queue_async_safe(queue, block)\
    if (dispatch_queue_get_label(DISPATCH_CURRENT_QUEUE_LABEL) == dispatch_queue_get_label(queue)) {\
        block();\
    } else {\
        dispatch_async(queue, block);\
    }
#endif

#ifndef dispatch_main_async_safe
#define dispatch_main_async_safe(block) dispatch_queue_async_safe(dispatch_get_main_queue(), block)
#endif

不是所有在主线程执行的任务,都是主队列的任务,但是主队列的任务,一定在主线程执行
如果在主线程内调用dispatch_async(dispatch_get_main_queue(), block),可能会导致block在下一次runloop执行,从而导致更新UI时出错,而且还浪费资源

- (void)viewDidLoad
{
    dispatch_async(dispatch_get_main_queue(), ^{
        [self asdasd];
    });
    
    dispatch_queue_t queue = dispatch_queue_create("asd", DISPATCH_QUEUE_CONCURRENT);
    dispatch_async(queue, ^{
        [self asdasdasd];
    });
    
    dispatch_main_async_safe(^{
        NSLog(@"666666");
    });
    
    NSLog(@"555555");
}

- (void)asdasd
{
    dispatch_main_async_safe(^{
        NSLog(@"111111");
    });
    NSLog(@"222222");
}

- (void)asdasdasd
{
    dispatch_main_async_safe(^{
        NSLog(@"3333333");
    });
    NSLog(@"444444");
}

输出顺序:

Controller.m:70 666666
Controller.m:69 555555
Controller.m:116    444444
Controller.m:106    111111
Controller.m:108    222222
Controller.m:114    3333333

这段代码个人理解就是block中执行的代码,如果在所在队列,则直接执行block中代码,否则在下一次runloop中执行。
使用dispatch_main_async_safe保证block中的代码在主线程执行。

相关文章

  • dispatch_queue_async_safe 与 disp

    不是所有在主线程执行的任务,都是主队列的任务,但是主队列的任务,一定在主线程执行如果在主线程内调用dispatch...

  • 判断是否当前队列

    今天在看SDWebImage时,发现一个宏dispatch_queue_async_safe dispatch_q...

  • 2017.11.23 display fun --STM8

    unsigned char disp_mode; unsigned char disp_last_mode; un...

  • 连续替换字符串时,关键字重复问题的一种解决思路

    出问题的代码如下 乍一看没什么问题, 但是当 disp_name 的值 与前一个 disp_name 所对应的 w...

  • web知识点

    该文章记于2021.04.13 一、display:none与visibility:hidden的区别? disp...

  • Function:disp

    用法 disp(A) celldisp(string) 含义 在命令行窗口展示这个变量的具体内容,句末加不加分号都...

  • Spring InitializingBean and Disp

    In Spring, InitializingBean and DisposableBean are two ma...

  • DISP子程序

    说明 本系列文章本人基本没有原创贡献,都是在学习过程中找到的相关书籍和教程相关内容的汇总和梳理编辑。为了尊重原创者...

  • ImageLoader 的配置

    public static DisplayImageOptions localOptions = new Disp...

  • css-04

    1. 元素的显示与隐藏 display 设置或检索对象是否及如何显示。display: none 隐藏对象disp...

网友评论

      本文标题:dispatch_queue_async_safe 与 disp

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