dispatch_after 的延遲執行分析
阿新 • • 發佈:2019-02-10
dispcth_after 是將block 中的任務延遲新增到它將要執行的佇列中去,而並不一定新增到佇列中就立即會去執行任務。
圖中表示是在5秒中後將任務新增到主佇列中,如果主佇列中還有另外的任務假設A、B 要執行,那麼這個任務會在任務A、B 執行完後才會開始執行。
驗證的程式碼如下:
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ NSLog(@"我是延遲執行的函式 --- "); }); dispatch_queue_t delayQueue = dispatch_queue_create("rx.queue.delay", nil); dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(6 * NSEC_PER_SEC)), delayQueue, ^{ NSLog(@"我是在子執行緒 delayQueue 中延遲執行的函式 --- "); }); NSLog(@"開始執行好耗時操作 --- "); for (int i = 0; i<1000000000; i++) { self.testCount ++; } NSLog(@"耗時操作執行完成 --- "); NSLog(@"第二個開始執行好耗時操作 --- "); for (int i = 0; i<1000000000; i++) { self.testCount ++; } NSLog(@"第二個耗時操作執行完成 --- ");
執行的結果如下:
可以看到,一開始進入介面就會有兩個的耗時操作的任務在主執行緒的佇列中執行以及等待執行,5秒鐘後會新增一個延遲執行的任務A到主執行緒中,6秒鐘後會新增一個延遲執行的任務B 到一個建立的子執行緒中。
佇列中,是執行完了一個任務才會去執行下一個任務的。在主執行緒的佇列中,任務A 是排在兩個耗時操作之後新增的,所以即使任務A 是在16:28:22 新增到佇列中的,它也並不會去執行,而是等到兩個耗時操作都執行完了才執行。
而任務B 呢,是在16:28:23 新增等到建立的子執行緒中的,由於子執行緒的佇列中並沒有任務在排隊,所以一新增上去就可以執行了。