寫在最前面:
轉自:https://blog.csdn.net/wpeng20125/article/details/73650569
對原文作了下排版利于理解,也感謝原文作者為我們說明這個函數
dispatch_time_t 類型,它的創建有兩個函數
-
dispatch_time(<#dispatch_time_t when#>, <#int64_t delta#>)
第一個參數是從什么時間開始,一般直接傳
DISPATCH_TIME_NOW
表示從現在開始
第二個參數表示具體的時間長度(不能直接傳 int 或 float), 可以寫成這種形式(int64_t)3* NSEC_PER_SEC
-
#define NSEC_PER_MSEC 1000000ull 每毫秒有1000000納秒
#define USEC_PER_SEC 1000000ull 每秒有1000000微秒
#define NSEC_PER_USEC 1000ull 每微秒有1000納秒
注意 delta 的單位是納秒!
1秒的寫作方式可以是 1* NSEC_PER_SEC; 1000* NSEC_PER_MSEC
或 USEC_PER_SEC* NSEC_PER_USEC
- 2.
dispatch_walltime(<#const struct timespec * _Nullable when#>, <#int64_t delta#>)
,
第一個參數是一個結構體, 創建的是一個絕對的時間點,比如 2016年10月10日8點30分30秒, 如果你不需要自某一個特定的時刻開始,可以傳 NUll,表示自動獲取當前時區的當前時間作為開始時刻, 第二參數意義同第一個函數
dispatch_time_t time = dispatch_walltime(NULL, 5* NSEC_PER_SEC);
兩個函數的不同
例如:
從現在開始,1小時之后是觸發某個事件
使用第一個函數創建的是一個相對的時間,第一個參數開始時間參考的是當前系統的時鐘,當 device 進入休眠之后,系統的時鐘也會進入休眠狀態, 第一個函數同樣被掛起; 假如 device 在第一個函數開始執行后10分鐘進入了休眠狀態,那么這個函數同時也會停止執行,當你再次喚醒 device 之后,該函數同時被喚醒,但是事件的觸發就變成了從喚醒 device 的時刻開始,1小時之后.
而第二個函數則不同,他創建的是一個絕對的時間點,一旦創建就表示從這個時間點開始,1小時之后觸發事件,假如 device 休眠了10分鐘,當再次喚醒 device 的時候,計算時間間隔的時間起點還是,開始時就設置的那個時間點, 而不會受到 device 是否進入休眠影響