1、 dispatch_after
在一段给定的、以纳秒为单位的时间段之后,将 Block Object 分派到一个分派队列。这
个函数需要的参数有:
Delay in nanoseconds
在执行指定的 Block Object(由第三个参数指定)之前 GCD 必须在一个给定的分派队列 (由第二个参数指定) 上等待的纳秒数。
Dispatch queue
Block Object (由第三个参数指定)在给定的延迟(由第一个参数指定)之后必须执行在其上执行的派送队列。
Block object
在指定的分派队列上等待一定纳秒后 Block Object 会被调用;它没有返回值并且不接受参数
int64_t delayInSeconds = 20.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
//
NSLog(@"oh fuck!");
});
像你看到的那样,对于 dispatch_after 和 dispatch_after_f 函数纳秒级延迟参数必须是类 dispatch_time_t,它是绝对时间的抽象表示形式。要得到这个参数的值,你要用此代码中演示的 dispatch_time 函数。这里是您可以传递给 dispatch_time 函数的参数:
Base time
假设这个值为 B,Delta parameter 值为 D,通过这个函数结束的时间就等于 B+D。您可以设置此参数的值到 DISPATCH_TIME_NOW 来把现在作为基时间,然后从现在使用 Delta 参数来确定 Delta。
Delta to add to base time
这个参数是要增加到计算时间参数来获取函数结果的纳秒。例如,表示一个从现在开始 3 秒的时间,你可以这样来写你的代码:
dispatch_time_t delay =
dispatch_time(DISPATCH_TIME_NOW, 3.0f * NSEC_PER_SEC); 或者表示从现在开始半秒的时间:
dispatch_time_t delay =
dispatch_time(DISPATCH_TIME_NOW, (1.0 / 2.0f) * NSEC_PER_SEC);
2、dispatch_after_f
分派一个 C 函数到 GCD 在限定的、以纳秒限定的时间之后执行,这个函数接受 4 个参数:
Delay in nanoseconds
在执行给定函数之前 (由第四个参数指定)GCD 必须在指定派送队列(由第二个参数指定) 上等待的纳秒数。
Dispatch queue
C 函数 (由第四个参数指定) 必须在给定延迟(由第一个参数指定)之后在其上执行分派送队列。
Context
一个值在堆中传递到了 C 函数的内存地址 (举例见 5.5)。
C 函数
在特定时间段(由第一个参数指定)之后必须执行的 C 函数在给定分派队列中(由第二个
参数指定)的地址。
double delayInSeconds = 2.0;
dispatch_time_t delayInNanoSeconds=dispatch_time(DISPATCH_TIME_NOW, delayInNanoSeconds*NSEC_PER_SEC);
dispatch_queue_t cur=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_after_f(delayInNanoSeconds, cur, NULL, processSomething);
}
void processSomething(void *paramContext)
{
/* Do your processing here */
NSLog(@"Processing...");
}
二、在 GCD 上一个任务最多执行一次--使用 dispatch_once 函数
函数 dispatch_once,它接受 2 个
参数:
Token
一个类 dispatch_once_t 的 Token 持有 GCD 是代码块第一次执行时生成的 Token。如果
你想最多一次执行一段代码,那么无论什么时候这个代码在 APP 中被调用你必须指定在这
个方法中指定同样的 Token。
Block Object
Block Object 最多执行一次。这个 Block Object 返回时没有值并且没有参数。 dispatch_once 总是被发出呼叫的代码用来在当前队列上执行任务,它可能是一个串行队列、一个并发队列或者一个主队列。
staticdispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
});