dispatch_after 是來延遲執行的GCD方法,因為在主線程中我們不能用sleep來延遲方法的調用,所以用dispatch_after是最合適的 dispatch_after 能讓我們添加進隊列的任務延時執行,該函數並不是在指定時間後執行處理,而只是在指定時間追加處理到dispatch_qu ...
dispatch_after 是來延遲執行的GCD方法,因為在主線程中我們不能用sleep來延遲方法的調用,所以用dispatch_after是最合適的
dispatch_after 能讓我們添加進隊列的任務延時執行,該函數並不是在指定時間後執行處理,而只是在指定時間追加處理到dispatch_queue
GCD是Grand Central Dispatch的縮寫,是蘋果對多核硬體上執行併發代碼的一種支持。
它有以下優點:
- GCD通過把計算密集型任務放於後臺運行,以此提高APP的響應速度。
- GCD提供了更簡單的併發模型,它優於線程鎖,並且幫助你避免併發bug。
- GCD基於底層、高性能的優化常規類型的代碼,例如單例。
//該方法的第一個參數是 time,第二個參數是 dispatch_queue,第三個參數是要執行的block。 //在主線程中延遲執行 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(6 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
//Your code... });
特別註意 : 上面這句 dispatch_after 的真正含義是在6秒後把任務添加進隊列中,並不是表示在6秒後執行,大部分情況該函數能達到我們的預期,只有在對時間要求非常精準的情況下才可能會出現問題。
參數dispatch_time_t解析
dispatch_time_t 有兩種形式的構造方式,第一種相對時間:通過 dispatch_time 函數。第二種是絕對時間,通過 dispatch_walltime 函數來獲取,其需要使用一個 timespec 的結構體來得到dispatch_time_t。
dispatch_time(<#dispatch_time_t when#>, <#int64_t delta#>) //DISPATCH_TIME_NOW 表示現在,NSEC_PER_SEC 表示的是秒數,它還提供了 NSEC_PER_MSEC 表示毫秒 dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, 10*NSEC_PER_SEC); //10s 之後‘執行’(也就是上面說的加入到隊列中) dispatch_walltime(<#const struct timespec * _Nullable when#>, <#int64_t delta#>) //要使用一個 timespec 的結構體 dispatch_walltime(<#const struct timespec * _Nullable when#>, <#int64_t delta#>) dispatch_time_t time_w = dispatch_walltime(DISPATCH_TIME_NOW, 3 * NSEC_PER_SEC); NSLog(@"——————————————————————————"); //在主線程中延遲執行 dispatch_after(time_w, dispatch_get_main_queue(), ^{ NSLog(@"======================="); });
解析dispatch_time和dispatch_walltime
dispatch_time stops running when your computer goes to sleep. dispatch_walltime continues running. So if you want to do an action in one hour minutes, but after 5 minutes your computer goes to sleep for 50 minutes, dispatch_walltime will execute an hour from now, 5 minutes after the computer wakes up. dispatch_time will execute after the computer is running for an hour, that is 55 minutes after it wakes up.
dispatch_time 得到的時間長度是相對的,與設備 running 時間相關,即設備運行時才計時;而 dispatch_walltime 設定的時間段是絕對的,與設備是否running無關;