GCD系列:dispatch_after, dispatch_apply, dispatch_once

一、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的经典实用场景是单例

你可能感兴趣的:(GCD系列:dispatch_after, dispatch_apply, dispatch_once)