GCD是一个延迟执行的函数,他有两个参数,第一个参数是dispatch_time_t即延迟多长时间,第二个参数是dispatch_queue_t即添加在哪个队列中
dispatch_after(dispatch_time_t when, dispatch_queue_t queue,
dispatch_block_t block);
dispatch_after添加在某个队列中延迟执行block中的任务,是要等待该队列中的任务执行完才会执行block,也就是如果线程阻塞,延迟执行的时间就不确定了,可能并不是你设置的时长。
例如:
NSLog(@"第一步");
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
NSLog(@"我是延迟执行的函数 ---%@",[NSThread currentThread]);
});
NSLog(@"耗时任务开始");
NSInteger count = 0;
for (long long i = 0; i < 5000000000; i++)
{
count ++;
}
NSLog(@"耗时任务结束");
通过执行结果我们可以发现,dispatch_after函数block内的打印是在12秒以后才执行,并不是我们设置的5秒,这是因为此时dispatch_after函数的第二个参数传入的是主线程,延迟任务添加在了主线程中,而主线程中有一个耗时的打印任务,要等这个耗时任务执行完才执行dispatch_after的block。
下面我们将dispatch_after函数第二个参数改成另一个队列
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(@"我是延迟执行的函数 ---%@",[NSThread currentThread]);
});
NSLog(@"耗时任务开始");
NSInteger count = 0;
for (long long i = 0; i < 5000000000; i++)
{
count ++;
}
NSLog(@"耗时任务结束");
我们发现确实是按照我们设定的5秒执行的