iOS開發:Swift多線程GCD的使用

  除了上一篇文章說到到NSThread線程,還有一個GCD(Grand Central Dispath),是Apple新開發的一個解決多核編程的解決方案,充分的利用CPU資源,將全部的任務,放到一個任務隊列進行調度。 GCD 默認提供了全局的併發隊列,供整個應用使用,不須要建立。html

  • 同步和異步的區別
    • dispatch_sync 同步:不具有開啓線程的能力
    • dispatch_async 異步 :具有開啓線程的能力
  •  任務的執行方式
    • 併發隊列:多個任務同時執行,併發只能在一步函數下才執行異步「
    • 串行隊列:讓任務一個接一個的運行

注意:通常在實際開發中最經常使用的是 dispatch_async 。編程

下面介紹幾種經常使用的隊列使用併發

一:最最經常使用的全局併發隊列:異步

      //獲取全局併發隊列
        let queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
        //將任務添加到隊列中 併發執行
        dispatch_async(queue) { () -> Void in
            //doSomething...任務1
        }
        dispatch_async(queue) { () -> Void in
            //doSomething...任務2
        }
        dispatch_async(queue) { () -> Void in
            //doSomething...任務3
        }
        
        //暫停一個隊列
        dispatch_suspend(queue)
        //繼續隊列
        dispatch_resume(queue)

 

二:串行隊列,隊列中的任務不會併發執行,會一個任務執行完成後再執行另一個任務async

 //建立串行隊列
        let serialQueue = dispatch_queue_create("dispatch_queue_name", nil)
        //將任務添加到隊列中 一個任務執行完成後再執行另外一個任務
        dispatch_async(serialQueue) { () -> Void in
            //doSomething... 任務1
        }
        dispatch_async(serialQueue) { () -> Void in
            //doSomething... 任務2
        }
        dispatch_async(serialQueue) { () -> Void in
            //doSomething... 任務3
        }

 

三:GCD線程間的通訊,一般用於子線程請求完數據,回到主線程更新UI函數

 //線程間通訊
     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) { () -> Void in
            // 在子線程作一些事情
            dispatch_async(dispatch_get_main_queue(), { () -> Void in
                //在主線程更新UI...
            })
        }

 

四:線程延時執行spa

    //線程延時執行
        let second:Double = 3.0
        let dtime = dispatch_time(DISPATCH_TIME_NOW, Int64(second * Double(NSEC_PER_SEC)))
        
        //3s後回到主線程中執行任務
        dispatch_after(dtime, dispatch_get_main_queue()) { () -> Void in
            
        }
        //3s後會開啓一個新的線程執行隊列中的任務
        dispatch_after(dtime, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) { () -> Void in
            
        }

 

五:一次性代碼,顧名思義,在應用生命週期內,block裏代碼塊只會執行一次。線程

      var once:dispatch_once_t = 0
        dispatch_once(&once, { () -> Void in
            //在應用生命週期內只執行一次
        })
      

 

六:隊列組:將一些任務放進一個隊列組,當全部任務執行完成後,會執行組的notify。code

    /**********************************隊列組******************************************/
        let group = dispatch_group_create()
        let groupQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) 
        dispatch_group_async(group, groupQueue){ () -> Void in
            //任務1
        }
        dispatch_group_async(group, groupQueue){ () -> Void in
            //任務2
        }
        dispatch_group_async(group, groupQueue){ () -> Void in
            //任務3
        }
        dispatch_group_notify(group, groupQueue) { () -> Void in
            // 會等任務一、任務二、任務3執行完畢後執行
        }

 

 

完!htm

相關文章
相關標籤/搜索