iOS GCD之dispatch_after

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

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

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

例如:

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

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

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

    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(@"耗時(shí)任務(wù)開(kāi)始");
    NSInteger count = 0;
    for (long long i = 0; i < 5000000000; i++)
    {
        count ++;
    }
    NSLog(@"耗時(shí)任務(wù)結(jié)束");
屏幕快照 2019-06-01 下午7.31.47.png

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

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

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

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