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í)行的