iOS GCD使用dispatch_after、dispatch_time、dispatch_walltime

dispatch_after

我們經常會有需要一個方法或者處理需要延遲一段時間執行,dispatch_after函數就是用來實現這種功能

    NSLog(@"2秒后執行");
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        NSLog(@"等了2秒,開始執行任務");
        sleep(1);
        NSLog(@"任務執行完成");
    });

打印結果如下

16:44:04.949 2秒后執行
16:44:06.950 等了2秒,開始執行任務
16:44:07.955 任務執行完成

dispatch_after有三個參數,第一個參與用來指定時間,傳入的是dispatch_time_t類型的值,通過dispatch_time和dispatch_walltime函數生成。第二個參數是任務添加的隊列,第三個是任務的block。

dispatch_after的功能是在指定的時間將任務加入到隊列中,而不是在指定的時間執行,如果所在的隊列上有耗時任務在執行,那么時間上可能出現誤差。

    NSLog(@"2秒后執行");
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        NSLog(@"等了2秒,開始執行任務");
        sleep(1);
        NSLog(@"任務執行完成");
    });
    
    sleep(5);

打印結果

10:04:41.799 2秒后執行
10:04:46.825 等了2秒,開始執行任務
10:04:47.827 任務執行完成

dispatch_time

dispatch_time需要傳入兩個參數,第一個參數是時間點,第二個參數是時間長度,函數的作用就是獲取時間點經過時間長度之后的時間點。第一個參數我們經常使用的是DISPATCH_TIME_NOW,表示現在這個時間點。第二個參數表示的時間長度使用數組* NSEC_PER_SEC的方式獲得。

  • NSEC_PER_SEC 表示秒
  • NSEC_PER_MSEC 表示毫秒
  • NSEC_PER_USEC 表示微秒

dispatch_walltime

dispatch_walltime函數的第一個參數需要一個struct timespec類型的值,第二個參數是以納秒為單位的延遲時間。

    //設置時間點為2秒后
    NSTimeInterval iT = [[NSDate dateWithTimeInterval:2 sinceDate:[NSDate date]] timeIntervalSince1970];

    struct timespec time;
    time.tv_sec = (NSInteger)iT;
    //比時間點再晚10秒
    dispatch_time_t timer = dispatch_walltime(&time, 10*NSEC_PER_SEC);
    NSLog(@"12秒后開始任務");
    dispatch_after(timer, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
        NSLog(@"任務開始");
        
        sleep(1);

        NSLog(@"任務完成");
    });

打印結果

11:05:40.685 12秒后開始任務
11:05:52.000 任務開始
11:05:53.003 任務完成
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • GCD筆記 總結一下多線程部分,最強大的無疑是GCD,那么先從這一塊部分講起. Dispatch Queue的種類...
    jins_1990閱讀 783評論 0 1
  • iOS多線程編程 基本知識 1. 進程(process) 進程是指在系統中正在運行的一個應用程序,就是一段程序的執...
    陵無山閱讀 6,111評論 1 14
  • 一:base.h 二:block.h 1. dispatch_block_flags:DISPATCH_BLOCK...
    小暖風閱讀 2,479評論 0 0
  • 很久前的總結,今天貼出來。適合看了就用,很少講解,純粹用法。 目錄 Dispatch Queue dispatch...
    和女神經常玩閱讀 689評論 0 3
  • Grand Central Dispath(GCD):是iOS 4和OS X Snow Leopard 開始引入的...
    明若晴空閱讀 1,182評論 0 0