一、dispatch_after
功能:延迟一段时间把一项任务提交到队列中执行,返回之后就不能取消
常用来在在主队列上延迟执行一项任务
dispatch_after是延迟提交,不是延迟运行
先看看官方文档的说明:
Enqueue a block for execution at the specified time.
Enqueue,就是入队,指的就是将一个Block在特定的延时以后,加入到指定的队列中,不是在特定的时间后立即运行!。
函数原型
void
dispatch_after(dispatch_time_t when,
dispatch_queue_t queue,
dispatch_block_t block)
参数
when 过了多久执行的时间间隔
queue 提交到的队列
block 执行的任务
用dispatch_after的时候就会用到dispatch_time_t变量,但是如何创建合适的时间呢?答案就是用dispatch_time函数,其原型如下:
dispatch_time
dispatch_time_t
dispatch_time(dispatch_time_t when, int64_t delta);
参数
when 从什么时候开始执行
delta 延时的具体时间
第一个参数一般是DISPATCH_TIME_NOW,表示从现在开始。
要特别注意的是,delta参数是“纳秒!”,就是说,延时1秒的话,delta应该是“1000000000”=。=,太长了,所以理所当然系统提供了常量,如下:
#define NSEC_PER_SEC 1000000000ull
#define NSEC_PER_MSEC 1000000ull
#define USEC_PER_SEC 1000000ull
#define NSEC_PER_USEC 1000ull
关键词解释:
NSEC:纳秒。
USEC:微妙。
SEC:秒
PER:每
二、dispatch_apply
功能:把一项任务提交到队列中多次执行,具体是并行执行还是串行执行由队列本身决定.注意,dispatch_apply不会立刻返回,在执行完毕后才会返回,是同步的调用。
void
dispatch_apply(size_t iterations,
dispatch_queue_t queue,
void (^block)(size_t));
参数
iterations 执行的次数
queue 提交到的队列
block 执行的任务
那么,何时使用这个函数呢?从它的功能不难看出,如果我们可以把不相关的循环提交到后台线程并行执行,并且循环任务调度到后台执行的效率提高,能抵消掉队列调度本身的开销,那么效率会显著提高。
三、dispatch_once
功能:保证在APP运行期间,block中的代码只执行一次
dispatch_once(dispatch_once_t *predicate,
^(void)block)
参数
predicate 用来判断提交的block是否执行完成
block 执行一次的任务
dispatch_once的经典实用场景是单例