iOS GCD之dispatch_after

GCD是一個延遲執(zhí)行的函數(shù),他有兩個參數(shù),第一個參數(shù)是dispatch_time_t即延遲多長時間,第二個參數(shù)是dispatch_queue_t即添加在哪個隊列中

dispatch_after(dispatch_time_t when, dispatch_queue_t queue,
        dispatch_block_t block);

dispatch_after添加在某個隊列中延遲執(zhí)行block中的任務(wù),是要等待該隊列中的任務(wù)執(zhí)行完才會執(zhí)行block,也就是如果線程阻塞,延遲執(zhí)行的時間就不確定了,可能并不是你設(shè)置的時長。

例如:

    NSLog(@"第一步");
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        NSLog(@"我是延遲執(zhí)行的函數(shù) ---%@",[NSThread currentThread]);
    });
    
    NSLog(@"耗時任務(wù)開始");
    NSInteger count = 0;
    for (long long i = 0; i < 5000000000; i++)
    {
        count ++;
    }
    NSLog(@"耗時任務(wù)結(jié)束");
屏幕快照 2019-06-01 下午7.19.46.png

通過執(zhí)行結(jié)果我們可以發(fā)現(xiàn),dispatch_after函數(shù)block內(nèi)的打印是在12秒以后才執(zhí)行,并不是我們設(shè)置的5秒,這是因為此時dispatch_after函數(shù)的第二個參數(shù)傳入的是主線程,延遲任務(wù)添加在了主線程中,而主線程中有一個耗時的打印任務(wù),要等這個耗時任務(wù)執(zhí)行完才執(zhí)行dispatch_after的block。

下面我們將dispatch_after函數(shù)第二個參數(shù)改成另一個隊列

    dispatch_queue_t queue = dispatch_queue_create("test", DISPATCH_QUEUE_CONCURRENT);
    NSLog(@"第一步");
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), queue, ^{
        NSLog(@"我是延遲執(zhí)行的函數(shù) ---%@",[NSThread currentThread]);
    });
    
    NSLog(@"耗時任務(wù)開始");
    NSInteger count = 0;
    for (long long i = 0; i < 5000000000; i++)
    {
        count ++;
    }
    NSLog(@"耗時任務(wù)結(jié)束");
屏幕快照 2019-06-01 下午7.31.47.png

我們發(fā)現(xiàn)確實是按照我們設(shè)定的5秒執(zhí)行的

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容