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