_6_GCD相关-延迟添加执行任务

经常有这样的情况: 想在延迟几秒后执行任务. 这种情况, 可以使用 dispatch_after 函数来实现.

如下代码表示 在3秒后将指定的 Block 追加到 Main Dispatch Queue 中:

_6_GCD相关-延迟添加执行任务_第1张图片

需要注意的是: dispatch_after 函数并不是在指定时间后执行任务, 而只是在指定时间后追加 Block 到 Dispatch Queue 中. 上面的源代码表示定时3秒, 之后用 dispatch_async 函数追加 Block 到 Main Dispatch Queue 中. 同时延时并不阻塞主线程的执行.

因为 Main Dispatch Queue 在主线程的 RunLoop 中执行, 所以在 比如每隔 1/60 秒执行的 RunLoop 中, Block 最快在3秒后执行, 最慢在3秒 + 1/60秒后执行, 并且在 Main Dispatch Queue 有大量任务追加或主线程的任务本身有延迟时, 这个时间会更长.

所以这个函数在具有严格时间的要求时, 会出现问题.

dispatch_after 函数的参数


我们来看看 dispatch_after 这个函数的参数:

第一个参数: 是指定时间, 用的 dispatch_time_t 类型的值. 该值使用 dispatch_time 函数或 dispatch_walltime(下面介绍) 函数返回.

第二个参数:是指定追加任务的 Dispatch Queue.

第三个参数:是想要执行任务的 Block.

dispatch_time 函数的参数


第一个参数:指定时间的开始. 这个参数经常使用的值是上面源代码中使用的 DISPATCH_TIME_NOW. 这表示现在的时间. 即以下源代码可得到表示从现在开始 1秒 后的 dispatch_time_t 类型的值.

第二个参数:指定的毫微秒单位时间后的时间. 1ull 和 NSEC_PER_SEC 的乘积得到单位为毫微秒的数值. "ull" 是 C语言的数值字面量, 是显示表明类型时使用的字符串(表示 "unsigned long long"). 如果使用 NSEC_PER_MSEC 则可以以毫秒为单位计算. 以下源代码表示从现在开始 150 毫秒后时间的值.

dispatch_walltime 函数


dispatch_walltime 函数由 POSIX 中使用的 struct timespec 类型的时间得到 dispatch_time_t 类型的值.

_6_GCD相关-延迟添加执行任务_第2张图片

dispatch_time 函数通常用于计算 相对时间, 而dispatch_walltime 函数用于计算 绝对时间.



例如 想指定 2017年01月19日16时28分19秒这一绝对时间, struct timespec 类型的时间可以很轻松地通过 NSDate 对象得到.

_6_GCD相关-延迟添加执行任务_第3张图片

上面代码通过一个 NSDate 对象, 返回 dispatch_time_t 类型的变量.

OK, 延迟添加执行任务就到这里.

End.

你可能感兴趣的:(_6_GCD相关-延迟添加执行任务)