iOS多線程-GCD之常用函數(shù)

  • 延遲執(zhí)行任務(wù)函數(shù)dispatch_after(.....)

    -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    NSLog(@"start");
    //dispatch_after 是異步執(zhí)行的
    //隊(duì)列只決定在哪個(gè)線程中執(zhí)行任務(wù) 并不能決定執(zhí)行時(shí)間
    /**
     * 第一個(gè)參數(shù): 在哪個(gè)時(shí)間點(diǎn)執(zhí)行
     *            dispatch_time(從哪個(gè)時(shí)間點(diǎn)開始,經(jīng)歷多少納秒)
     * 第二個(gè)參數(shù): 在哪個(gè)隊(duì)列中執(zhí)行block任務(wù)
     * 第三個(gè)參數(shù): block任務(wù)
     */
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        NSLog(@"%@",[NSThread currentThread]);
    });
    NSLog(@"end");
    

}
```

  • 一次性執(zhí)行dispatch_once(...)

   -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    //一次性執(zhí)行的機(jī)制,能保證在程序啟動(dòng)后只會(huì)執(zhí)行一次,并且是線程安全的,在主線程中執(zhí)行
    //一般使用dispatch_once來(lái)做一次性執(zhí)行,效率高, 在單例模式中使用.
    //可以利用互斥鎖在實(shí)現(xiàn)此功能,但不建議使用,因?yàn)樾史浅5?!!!
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        NSLog(@"");
    });
}
  • 柵欄函數(shù)dispatch_barrier_async/dispatch_barrier_sync

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{

   dispatch_queue_t queue = dispatch_queue_create("yuxuan", DISPATCH_QUEUE_CONCURRENT);

   dispatch_async(queue, ^{
       NSLog(@"任務(wù)1");
   });

    dispatch_async(queue, ^{
       NSLog(@"任務(wù)2");
    });

    //柵欄函數(shù)(同步函數(shù)就沒必要控制順序了,因?yàn)樗怯行虻?
            //dispatch_barrier_async 是異步函數(shù)不會(huì)阻塞線程
            //dispatch_barrier_sync 是同步函數(shù) 會(huì)阻塞線程
    //如果所有任務(wù)都在同一個(gè)并行隊(duì)列中,并且這個(gè)并行隊(duì)列不是系統(tǒng)自帶全局并行隊(duì)列
    //哪么在barrier之前添加的方法會(huì)先被執(zhí)行,只有等barrier之前的任務(wù)執(zhí)行完畢后才會(huì)執(zhí)行barrier任務(wù)
    //只有barrier任務(wù)執(zhí)行完畢后,才會(huì)執(zhí)行后添加的任務(wù)
    dispatch_barrier_async(queue, ^{
        NSLog(@"我是個(gè)可愛的路障");
    });

    dispatch_async(queue, ^{
       NSLog(@"任務(wù)3");
    });

    dispatch_async(queue, ^{
       NSLog(@"任務(wù)4");
    });

    NSLog(@"end");
}
  • 隊(duì)列組的使用dispatch_group_t

    • 方式一:

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{

    //創(chuàng)建一個(gè)隊(duì)列組
    dispatch_group_t group = dispatch_group_create();

    //創(chuàng)建兩個(gè)不同的隊(duì)列來(lái)測(cè)試
    dispatch_queue_t queue1 = dispatch_get_global_queue(0, 0);

    dispatch_queue_t queue2 = dispatch_queue_create("yuxuan", DISPATCH_QUEUE_CONCURRENT);

    //dispatch_group_async 異步函數(shù)
    //系統(tǒng)會(huì)先把任務(wù)放入隊(duì)列中,然后把隊(duì)列放入組中
    //從組中把隊(duì)列取出來(lái),在從隊(duì)列里取任務(wù)執(zhí)行
    dispatch_group_async(group, queue1, ^{
    [NSThread sleepForTimeInterval:1.0];
        NSLog(@"download 1");
    });

    dispatch_group_async(group, queue2, ^{
        [NSThread sleepForTimeInterval:1.0];
        NSLog(@"download 2");
    });
    //給group添加一個(gè)通知,異步函數(shù)
    //當(dāng)group隊(duì)列中所有任務(wù)執(zhí)行完畢,就會(huì)通知group執(zhí)行block
    /*
     * 第一個(gè)參數(shù): 為那個(gè)隊(duì)列組添加通知
     * 第二個(gè)參數(shù): 決定block在什么線程中執(zhí)行
     * 第三個(gè)參數(shù): block 代碼塊
     */
    dispatch_group_notify(group, dispatch_queue_create("yuxuan1",DISPATCH_QUEUE_CONCURRENT), ^{
        NSLog(@"OK");
    });
   NSLog(@"end");
}
- ###方式二:
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    /*
     dispatch_group_async底層實(shí)現(xiàn):
     void dispatch_group_async(dispatch_group_t group, dispatch_queue_t queue, dispatch_block_t block)
     {
         dispatch_retain(group);
         dispatch_group_enter(group);
         dispatch_async(queue, ^{
             block();
             dispatch_group_leave(group);
             dispatch_release(group);
         });
     }
     */
    dispatch_queue_t queue = dispatch_get_global_queue(0, 0);

    //創(chuàng)建一個(gè)隊(duì)列組
    dispatch_group_t group =  dispatch_group_create();

    //通知隊(duì)列組進(jìn)入隊(duì)列組
    dispatch_group_enter(group);

    dispatch_async(queue, ^{
        NSLog(@"111");
        //任務(wù)執(zhí)行完畢
        //通知隊(duì)列組離開隊(duì)列組
        dispatch_group_leave(group);
    });

    //通知隊(duì)列組進(jìn)入隊(duì)列組
    dispatch_group_enter(group);

    dispatch_async(queue, ^{
        NSLog(@"222");
        //任務(wù)執(zhí)行完畢
        //通知隊(duì)列組離開隊(duì)列組
        dispatch_group_leave(group);
    });

    //等待所有任務(wù)執(zhí)行完畢,一直等待.會(huì)阻塞線程
    dispatch_group_wait(group, DISPATCH_TIME_FOREVER);

    //    dispatch_group_notify(group, queue, ^{
    //        NSLog(@"over");
    //    });
}
  • GCD定時(shí)器

    -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
     //創(chuàng)建一個(gè)隊(duì)列,創(chuàng)建GCD定時(shí)器時(shí)使用
      dispatch_queue_t queue = dispatch_queue_create("yuxuan", DISPATCH_QUEUE_SERIAL);
      //創(chuàng)建一個(gè)GCD定時(shí)器(觸發(fā)器)
      //第四個(gè)參數(shù):傳入一個(gè)隊(duì)列,決定了定時(shí)器回調(diào)任務(wù)執(zhí)行方式.
      dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
      //dispatch_source_t其實(shí)本質(zhì)是一個(gè)類,由于是局部變量,方法執(zhí)行完,就會(huì)被釋放.
      self.timer = timer;
      //設(shè)置定時(shí)器
      /*
       第一個(gè)參數(shù):給那個(gè)定時(shí)器設(shè)置
       第二個(gè)參數(shù):什么時(shí)候啟動(dòng)
       第三個(gè)參數(shù):間隔多久執(zhí)行一次
       第四個(gè)參數(shù):設(shè)置精準(zhǔn)度:0 代表最高精準(zhǔn)(盡量讓定時(shí)器精準(zhǔn)), 大于0的的話代表是在多少秒內(nèi)接受.
       第四個(gè)參數(shù)存在意義:主要是為了提高程序性能, 設(shè)置越大,能減輕CPU的壓力
       注意:GCD定時(shí)器傳入的時(shí)間都是納秒
       */
      dispatch_source_set_timer(timer, DISPATCH_TIME_NOW, 1.0 * NSEC_PER_SEC, 0.0 * NSEC_PER_SEC);
       //第一個(gè)參數(shù):給那個(gè)定時(shí)器設(shè)置
      //第二個(gè)參數(shù):設(shè)置定時(shí)器回調(diào)block
      //異步執(zhí)行的,具有創(chuàng)建新線程的能力
      //具體是否創(chuàng)建線程,創(chuàng)建幾條線程是由定時(shí)任務(wù)創(chuàng)建時(shí),傳入的queue決定的
      dispatch_source_set_event_handler(timer, ^{
          NSLog(@"%@",[NSThread currentThread]);
      });
          //啟動(dòng)定時(shí)器
      dispatch_resume(timer);
    

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容