4月11日 GCD 总结(二)
1、?dispatch_after
在一段給定的、以納秒為單位的時間段之后,將 Block Object 分派到一個分派隊列。這
個函數(shù)需要的參數(shù)有:
Delay in nanoseconds
在執(zhí)行指定的 Block Object(由第三個參數(shù)指定)之前 GCD 必須在一個給定的分派隊列 (由第二個參數(shù)指定) 上等待的納秒數(shù)。
Dispatch queue
Block Object (由第三個參數(shù)指定)在給定的延遲(由第一個參數(shù)指定)之后必須執(zhí)行在其上執(zhí)行的派送隊列。
Block object
在指定的分派隊列上等待一定納秒后 Block Object 會被調用;它沒有返回值并且不接受參數(shù)
?
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 函數(shù)納秒級延遲參數(shù)必須是類 dispatch_time_t,它是絕對時間的抽象表示形式。要得到這個參數(shù)的值,你要用此代碼中演示的 dispatch_time 函數(shù)。這里是您可以傳遞給 dispatch_time 函數(shù)的參數(shù):
Base time
假設這個值為 B,Delta parameter 值為 D,通過這個函數(shù)結束的時間就等于 B+D。您可以設置此參數(shù)的值到 DISPATCH_TIME_NOW 來把現(xiàn)在作為基時間,然后從現(xiàn)在使用 Delta 參數(shù)來確定 Delta。
Delta to add to base time
這個參數(shù)是要增加到計算時間參數(shù)來獲取函數(shù)結果的納秒。例如,表示一個從現(xiàn)在開始 3 秒的時間,你可以這樣來寫你的代碼:
dispatch_time_t delay =
dispatch_time(DISPATCH_TIME_NOW, 3.0f * NSEC_PER_SEC); 或者表示從現(xiàn)在開始半秒的時間:
dispatch_time_t delay =
dispatch_time(DISPATCH_TIME_NOW, (1.0 / 2.0f) * NSEC_PER_SEC);?
2、dispatch_after_f
分派一個 C 函數(shù)到 GCD 在限定的、以納秒限定的時間之后執(zhí)行,這個函數(shù)接受 4 個參數(shù):
Delay in nanoseconds
在執(zhí)行給定函數(shù)之前 (由第四個參數(shù)指定)GCD 必須在指定派送隊列(由第二個參數(shù)指定) 上等待的納秒數(shù)。
Dispatch queue
C 函數(shù) (由第四個參數(shù)指定) 必須在給定延遲(由第一個參數(shù)指定)之后在其上執(zhí)行分派送隊列。
Context
一個值在堆中傳遞到了 C 函數(shù)的內存地址 (舉例見 5.5)。
C 函數(shù)
在特定時間段(由第一個參數(shù)指定)之后必須執(zhí)行的 C 函數(shù)在給定分派隊列中(由第二個
參數(shù)指定)的地址。
{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?上一個任務最多執(zhí)行一次--使用?dispatch_once?函數(shù)
函數(shù)?dispatch_once,它接受 2 個
參數(shù):
Token
一個類 dispatch_once_t 的 Token 持有 GCD 是代碼塊第一次執(zhí)行時生成的 Token。如果
你想最多一次執(zhí)行一段代碼,那么無論什么時候這個代碼在 APP 中被調用你必須指定在這
個方法中指定同樣的 Token。
?Block Object
Block Object 最多執(zhí)行一次。這個 Block Object 返回時沒有值并且沒有參數(shù)。 dispatch_once 總是被發(fā)出呼叫的代碼用來在當前隊列上執(zhí)行任務,它可能是一個串行隊列、一個并發(fā)隊列或者一個主隊列。
?static dispatch_once_t onceToken;
? ? dispatch_once(&onceToken, ^{
?? ? ? ?
? ? });
總結
以上是生活随笔為你收集整理的4月11日 GCD 总结(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 4月11日 GCD 总结(一)
- 下一篇: OPPO ColorOS 13 系统 3