开发知识点

iOS GCD使用dispatch_after、dispatch

2019-03-05  本文已影响0人  没脑子的程序员

dispatch_after

我们经常会有需要一个方法或者处理需要延迟一段时间执行,dispatch_after函数就是用来实现这种功能

    NSLog(@"2秒后执行");
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        NSLog(@"等了2秒,开始执行任务");
        sleep(1);
        NSLog(@"任务执行完成");
    });

打印结果如下

16:44:04.949 2秒后执行
16:44:06.950 等了2秒,开始执行任务
16:44:07.955 任务执行完成

dispatch_after有三个参数,第一个参与用来指定时间,传入的是dispatch_time_t类型的值,通过dispatch_time和dispatch_walltime函数生成。第二个参数是任务添加的队列,第三个是任务的block。

dispatch_after的功能是在指定的时间将任务加入到队列中,而不是在指定的时间执行,如果所在的队列上有耗时任务在执行,那么时间上可能出现误差。

    NSLog(@"2秒后执行");
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        NSLog(@"等了2秒,开始执行任务");
        sleep(1);
        NSLog(@"任务执行完成");
    });
    
    sleep(5);

打印结果

10:04:41.799 2秒后执行
10:04:46.825 等了2秒,开始执行任务
10:04:47.827 任务执行完成

dispatch_time

dispatch_time需要传入两个参数,第一个参数是时间点,第二个参数是时间长度,函数的作用就是获取时间点经过时间长度之后的时间点。第一个参数我们经常使用的是DISPATCH_TIME_NOW,表示现在这个时间点。第二个参数表示的时间长度使用数组* NSEC_PER_SEC的方式获得。

dispatch_walltime

dispatch_walltime函数的第一个参数需要一个struct timespec类型的值,第二个参数是以纳秒为单位的延迟时间。

    //设置时间点为2秒后
    NSTimeInterval iT = [[NSDate dateWithTimeInterval:2 sinceDate:[NSDate date]] timeIntervalSince1970];

    struct timespec time;
    time.tv_sec = (NSInteger)iT;
    //比时间点再晚10秒
    dispatch_time_t timer = dispatch_walltime(&time, 10*NSEC_PER_SEC);
    NSLog(@"12秒后开始任务");
    dispatch_after(timer, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
        NSLog(@"任务开始");
        
        sleep(1);

        NSLog(@"任务完成");
    });

打印结果

11:05:40.685 12秒后开始任务
11:05:52.000 任务开始
11:05:53.003 任务完成
上一篇下一篇

猜你喜欢

热点阅读