GCD之dispatch_after

序言:经常需要在等待一定时间后,执行代码块。但是需要注意的是,dispatch_after不是在指定的时间后执行代码块,而是在指定的时间追加处理到dispatch queue,因为还有可能有大量的其他追加或者系统本身的原因,这个时间往往比指定的时间更长,所以严格来讲,dispatch_after是大致延时处理。

使用的方法如下:

GCD之dispatch_after_第1张图片
Snip20170510_2.png

xcode中的code snippet是这样的,也是最经常的用法,只需填入具体的秒数,即可添加处理代码。

  • 以上图片中的红色框框对于dispatch_after函数来说,是一个参数dispatch_time_t;这也是这篇笔记要讲的另外一个重点:
    dispatch_time_t类型可以使用dispatch_time函数或者dispatch_walltime函数获得。
    前者主要是用于计算相对时间,而后者用于计算绝对时间(类似于闹钟功能)。
  1. dispatch_time函数使用简单,上面截图就是构造方法,这里就不继续扒了。
    2.1. dispatch_walltime函数由POSIX中使用的struct timespec
    类型的时间得到dispatch_time_t类型的值。
    2.2 struct timespec类型的时间可以很轻松地通过NSDate类对象得到。
    2.3 NSDate转struct timespec类型代码如下:
dispatch_time_t getDispatchTimeFromDate(NSDate *date)
{
    NSTimeInterval interval = [date timeIntervalSince1970];
    double second,subsecond;
    subsecond = modf(interval, &second);
    struct timespec time;
    time.tv_sec = second;
    time.tv_nsec = subsecond * NSEC_PER_SEC;
    dispatch_time_t mileStone = dispatch_walltime(&time, 0);
    return mileStone;
}

附上 struct timespec定义

#ifndef _STRUCT_TIMESPEC
#define _STRUCT_TIMESPEC    struct timespec
_STRUCT_TIMESPEC
{
    __darwin_time_t tv_sec;
    long            tv_nsec;
};
#endif 

你可能感兴趣的:(GCD之dispatch_after)