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é)束");
通過(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é)束");
我們發(fā)現(xiàn)確實(shí)是按照我們?cè)O(shè)定的5秒執(zhí)行的