GCD之dispatch_after
2017-05-08 本文已影响18人
yehkong
序言:经常需要在等待一定时间后,执行代码块。但是需要注意的是,dispatch_after不是在指定的时间后执行代码块,而是在指定的时间追加处理到dispatch queue,因为还有可能有大量的其他追加或者系统本身的原因,这个时间往往比指定的时间更长,所以严格来讲,dispatch_after是大致延时处理。
使用的方法如下:
Snip20170510_2.png
xcode中的code snippet是这样的,也是最经常的用法,只需填入具体的秒数,即可添加处理代码。
- 以上图片中的红色框框对于dispatch_after函数来说,是一个参数dispatch_time_t;这也是这篇笔记要讲的另外一个重点:
dispatch_time_t类型可以使用dispatch_time函数或者dispatch_walltime函数获得。
前者主要是用于计算相对时间,而后者用于计算绝对时间(类似于闹钟功能)。
- 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