开发中常用到GCD方法dispatch_after(<#dispatch_time_t when#>, <#dispatch_queue_t _Nonnull queue#>, <#^(void)block#>)
方法进行延迟处理
一般在主线程中我们不能用sleep来进行延迟,所以用dispatch_after是最合适的。dispatch_after能让我们添加进队列的任务延时执行,这个函数并不是在指定时间后执行处理,而只是在指定时间后追加处理到dispatch_queue队列中执行。
OC中为dispatch_time_t提供了两种构造方法
①
dispatch_time(dispatch_time_t when, int64_t delta)
②dispatch_walltime(const struct timespec *_Nullable when, int64_t delta)
① 用法
dispatch_time_t time_t = dispatch_time(DISPATCH_TIME_NOW, 10* NSEC_PER_SEC);
dispatch_time_t when
系统提供两种定义如下
#define DISPATCH_TIME_NOW (0ull)
#define DISPATCH_TIME_FOREVER (~0ull)
②用法
dispatch_time_t time_t = dispatch_walltime(DISPATCH_TIME_NOW, 100* NSEC_PER_USEC)
二者的区别
当设备进入睡眠状态时,dispatch_time将停止运行,而dispatch_walltime可以继续运行。因此,如果您想在20分钟后完成一个指定操作,但是在5分钟时您的设备进入休眠状态并休眠10分钟,dispatch_walltime将从现在开始执行20分钟,即在计算机醒来后5分钟执行。dispatch_time将在设备醒来10分钟后执行。(即:设备休眠不会对dispatch_walltime计时产生影响,二会对dispatch_time产生影响,延长相应休眠时间。)
dispatch_time
得到的时间长度是相对设备运行时间,即设备运行时才计时;而dispatch_walltime
设定的时间段是绝对的,与设备是否运行无关;