首页 > 代码库 > GCD7: 利用GCD延时后执行任务

GCD7: 利用GCD延时后执行任务

功能:

你希望通过 GCD 指定一个延迟,延迟到后,继续执行相关代码。 

方案:

使用dispatch_after 和 dispatch_after_f函数

讨论:

通过Core Foundation,您可以在一段给定的时间之后调用对象中的选择器,这个调用可以使用 NSObject 类的performSelector:withObject:afterDelay:方法.
 
 
在 GCD 中 我们可以使用 dispatch_after 和 dispatch_after_f 函数达到一样的目的,两个函数分别描述如下: 

dispatch_after 在一段给定的、以纳秒为单位的时间段之后,将Block Object分派到一个分派队列。这个函数需要的参数有:

Delay in nanoseconds

  在执行指定的 Block Object之前 GCD 必须在一个给定的分派队列 (由第二个参数指定) 上等待的纳秒数。

Dispatch queue

  Block Object 在给定的延迟(由第一个参数指定)之后必须执行在其上执行的派送队列。

Block object

  在指定的分派队列上等待一定纳秒后Block Object会被调用;它没有返回值并且不接参数。 

 
dispatch_after_f 分派一个 C 函数到 GCD 在限定的、以纳秒限定的时间之后执行,这个函数接受 4 个参数:

Delay in nanoseconds

  等待的纳秒数。

Dispatch queue

  C 函数必须在给定延迟之后在其上执行分派送队列。

Context
  一个值在堆中传递到了 C 函数的内存地址。
C函数
  在特定时间段之后必须执行的 C 函数。 

 

下面先看一个dispatch_after的例子:

- (void)dispatchAfter{    double delayInSeconds = 2.0;    dispatch_time_t delayInNanoSeconds = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds*NSEC_PER_SEC);    dispatch_queue_t concurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);    dispatch_after(delayInNanoSeconds, concurrentQueue, ^{        NSLog(@"延迟执行");    });}
对于 dispatch_after 和 dispatch_after_f 函数纳秒级延迟参数必须是类 dispatch_time_t,它是绝对时间的抽象表示形式。要得到这个参数的值,你要用此代码中演 示的 dispatch_time 函数:

dispatch_time(dispatch_time_t when, int64_t delta)

例如,表示一个从现在开始 3 秒的时间,你可以这样来写你的代码: 
dispatch_time_t delay = dispatch_time(DISPATCH_TIME_NOW, 3.0f*NSEC_PER_SEC);

 

现在我们看看如何使用dispatch_after_f函数:

void processSomething(void *paramContext){    /* Do your processing here */    NSLog(@"Processing...");}- (void)dispatchAfterf{    dispatch_time_t delayInNanoSenconds = dispatch_time(DISPATCH_TIME_NOW, 2.0f*NSEC_PER_SEC);    dispatch_queue_t concurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);    dispatch_after_f(delayInNanoSenconds, concurrentQueue, NULL, processSomething);}

 

 

 

 

GCD7: 利用GCD延时后执行任务