美文网首页
dispatch_async(dispatch_get_main

dispatch_async(dispatch_get_main

作者: 海森V | 来源:发表于2018-10-12 14:15 被阅读62次

    1 请问以下代码的输出的顺序是什么?

     - (void)test{
        dispatch_async(dispatch_get_main_queue(), ^{
            NSLog(@"main");
        });
        for (int i = 0; i < 100000; i++) {
            NSLog(@"i");
        }
        [self tesfFunc];
    }
    - (void)tesfFunc{
        NSLog(@"testFunc");
    }
    

    经Xcode10测试:
    输出如下:


    屏幕快照 2018-10-12 下午1.54.48.png

    main 最后输出的。根据结果推导出:
    如下这种方式添加的:dispatch_async(dispatch_get_main_queue(), ^{})。block是在最后完成。苹果到底做了什么事情,未知,待续。实际中的影响就是其它代码完成block的代码才会执行。欢迎在评论区讨论!!!

    2 避免主线程中 dispatch_async(dispatch_get_main_queue(), ^{})block中的代码延迟执行,SDWebImage做了如下:

    #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
    

    3 如果不是asyn main_queue的不是在代码都执行完其它代码,再执行

    - (void)test{
       dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            NSLog(@"global");
        });
        for (int i = 0; i < 100000; i++) {
            NSLog(@"i");
        }
        [self tesfFunc];
    }
    - (void)tesfFunc{
        NSLog(@"testFunc");
    }
    

    相关文章

      网友评论

          本文标题:dispatch_async(dispatch_get_main

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