Swift3.0 GCD包看包會

一.概覽

程序啟動時,最先執(zhí)行主線程,來描繪用戶界面,處理觸摸等交互事件.如果耗時操作被放在主線程時,就會妨礙主運行循環(huán)(runloop)的執(zhí)行,從而使頁面長時間停滯,用戶不能交互.

先來理解關(guān)鍵字DispatchQueue的意思, 是執(zhí)行處理的隊列,從而衍生出兩種隊列.一種是等待現(xiàn)在執(zhí)行中助理的隊列Serial DispatchQueue(串行隊列),另一種是,不等待現(xiàn)在執(zhí)行中處理的隊列Concurrent DispatchQueue(并行隊列),串行就是一個個按順序處理事件,并行就是使用多個線程同時處理多個事件.

二.知道了是存在這兩種隊列,怎么得到這些DispatchQueue呢?

方法有兩種:

  1. 第一種:就是通過GCD的API生成DispatchQueue,在OC和Swift2.0中都使用了dispatch_queue_create的方法來生成,可是Swift3.0找不到這個方法了......不過可以用下面的方法來創(chuàng)建隊列

     //創(chuàng)建串行同步隊列
     let chuanxingtongbuQueue = DispatchQueue.init(label: "chuanxintongbu")
    
     chuanxingtongbuQueue.sync {
         print("1 ===== \(Thread.current)")
     }
     chuanxingtongbuQueue.sync {
         print("2 ===== \(Thread.current)")
     }
     chuanxingtongbuQueue.sync {
         print("3 ===== \(Thread.current)")
     }
    

//輸出結(jié)果:
1 ===== <NSThread: 0x61800007d400>{number = 1, name = main}
2 ===== <NSThread: 0x61800007d400>{number = 1, name = main}
3 ===== <NSThread: 0x61800007d400>{number = 1, name = main}

    //創(chuàng)建并行異步隊列
    let bingxingyibuQueue =  DispatchQueue(label: "bingxingyibu", attributes: DispatchQueue.Attributes.concurrent)
    bingxingyibuQueue.async {
        print("1 ===== \(Thread.current)")
    }
    bingxingyibuQueue.async {
        print("2 ===== \(Thread.current)")
    }
    bingxingyibuQueue.async {
        print("3 ===== \(Thread.current)")
    }

// 輸出結(jié)果:
1 ===== <NSThread: 0x618000261e00>{number = 3, name = (null)}
2 ===== <NSThread: 0x618000261e00>{number = 3, name = (null)}
3 ===== <NSThread: 0x608000271380>{number = 4, name = (null)}

  1. 第二種:獲取系統(tǒng)標(biāo)準提供的DispatchQueue,系統(tǒng)給提供了2個:MainDispatchQueue(主隊列)和GlobalDispatchQueue(全局隊列).
    GlobalDispatchQueue是并行的,只要獲取就能使用. GlobalDispatchQueue有四個優(yōu)先級,High(高優(yōu)先級),Default(默認優(yōu)先級),Low(低優(yōu)先級),Backgroud(后臺優(yōu)先級)
/*
         DISPATCH_QUEUE_PRIORITY_HIGH:  .userInitiated
        
         DISPATCH_QUEUE_PRIORITY_DEFAULT:  .default
        
         DISPATCH_QUEUE_PRIORITY_LOW: .utility
        
         DISPATCH_QUEUE_PRIORITY_BACKGROUND: .background
*/
  
        //qos:可以改變參數(shù)來改變優(yōu)先級,參數(shù)如上
        DispatchQueue.global(qos: .background).async {
        //進行耗時操作
                      DispatchQueue.main.async {
                        //更新UI
                }
        }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容