iOS GCD之dispatch_after

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(@"耗时任务结束");
6206716-a063b80ae3343598.png
屏幕快照 2019-06-01 下午7.19.46.png

通过执行结果我们可以发现,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(@"耗时任务结束");
6206716-45af52d690461dbd.png
屏幕快照 2019-06-01 下午7.31.47.png

我们发现确实是按照我们设定的5秒执行的

猜你喜欢

转载自blog.csdn.net/weixin_33836874/article/details/90918168
今日推荐