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); }