美文网首页
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

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