iOS GCD使用dispatch_after、dispatch_time、dispatch_walltime

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的方式获得。

  • NSEC_PER_SEC 表示秒
  • NSEC_PER_MSEC 表示毫秒
  • NSEC_PER_USEC 表示微秒

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 任务完成
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • GCD笔记 总结一下多线程部分,最强大的无疑是GCD,那么先从这一块部分讲起. Dispatch Queue的种类...
    jins_1990阅读 4,121评论 0 1
  • iOS多线程编程 基本知识 1. 进程(process) 进程是指在系统中正在运行的一个应用程序,就是一段程序的执...
    陵无山阅读 11,310评论 1 14
  • 一:base.h 二:block.h 1. dispatch_block_flags:DISPATCH_BLOCK...
    小暖风阅读 7,272评论 0 0
  • 很久前的总结,今天贴出来。适合看了就用,很少讲解,纯粹用法。 目录 Dispatch Queue dispatch...
    和女神经常玩阅读 3,952评论 0 3
  • Grand Central Dispath(GCD):是iOS 4和OS X Snow Leopard 开始引入的...
    明若晴空阅读 4,862评论 0 0