開發(fā)中常用到GCD方法dispatch_after(<#dispatch_time_t when#>, <#dispatch_queue_t _Nonnull queue#>, <#^(void)block#>) 方法進(jìn)行延遲處理
一般在主線程中我們不能用sleep來進(jìn)行延遲,所以用dispatch_after是最合適的。dispatch_after能讓我們添加進(jìn)隊(duì)列的任務(wù)延時(shí)執(zhí)行,這個(gè)函數(shù)并不是在指定時(shí)間后執(zhí)行處理,而只是在指定時(shí)間后追加處理到dispatch_queue隊(duì)列中執(zhí)行。
OC中為dispatch_time_t提供了兩種構(gòu)造方法
①
dispatch_time(dispatch_time_t when, int64_t delta)
②dispatch_walltime(const struct timespec *_Nullable when, int64_t delta)
① 用法
dispatch_time_t time_t = dispatch_time(DISPATCH_TIME_NOW, 10* NSEC_PER_SEC);
dispatch_time_t when 系統(tǒng)提供兩種定義如下
#define DISPATCH_TIME_NOW (0ull)
#define DISPATCH_TIME_FOREVER (~0ull)
②用法
dispatch_time_t time_t = dispatch_walltime(DISPATCH_TIME_NOW, 100* NSEC_PER_USEC)
二者的區(qū)別
當(dāng)設(shè)備進(jìn)入睡眠狀態(tài)時(shí),dispatch_time將停止運(yùn)行,而dispatch_walltime可以繼續(xù)運(yùn)行。因此,如果您想在20分鐘后完成一個(gè)指定操作,但是在5分鐘時(shí)您的設(shè)備進(jìn)入休眠狀態(tài)并休眠10分鐘,dispatch_walltime將從現(xiàn)在開始執(zhí)行20分鐘,即在計(jì)算機(jī)醒來后5分鐘執(zhí)行。dispatch_time將在設(shè)備醒來10分鐘后執(zhí)行。(即:設(shè)備休眠不會(huì)對(duì)dispatch_walltime計(jì)時(shí)產(chǎn)生影響,二會(huì)對(duì)dispatch_time產(chǎn)生影響,延長相應(yīng)休眠時(shí)間。)
dispatch_time得到的時(shí)間長度是相對(duì)設(shè)備運(yùn)行時(shí)間,即設(shè)備運(yùn)行時(shí)才計(jì)時(shí);而dispatch_walltime設(shè)定的時(shí)間段是絕對(duì)的,與設(shè)備是否運(yùn)行無關(guān);