swift多線程

iOS中。蘋果提供了兩張方法實現多任務處理

  1. GCD (Grand Central Dispatch)
  2. NSOperationQueue 框架

GCD 簡單示例

例1:

        //創建一個隊列
        let queue = DispatchQueue(label: "com.test.myqueue")
        //在隊列' queue' 中同步打印0~10
        queue.sync {
                for i in 0...10 {
                    print("??",i)
                }
        }
        
        //在'main queue'中打印10~20
        for i in 10...20 {
            print("M",i)
        }
        
        //結果:程序會卡住,在紅星代碼塊執行完后再執行下面的

例2

        //創建一個隊列
        let queue = DispatchQueue(label: "com.test1.myqueue")
        
        //在隊列' queue' 中異步打印0~10
        queue.async {
                for i in 0...50 {
                    print("??",i)
                }
        }
        
        //在'main queue'中打印10~500
        for i in 10...500 {
            print("M",i)
        }
        
        //結果: 兩個代碼塊并發執行

GCD隊列 優先級

從上到下,優先級從高到低:

  • userInteractive
  • userInitiated
  • default
  • utility
  • background
  • unspecified

例1:

        //兩個隊列優先級相同
        let queue1 = DispatchQueue(label: "test1", qos: .userInteractive)
        let queue2 = DispatchQueue(label: "test2", qos: .userInteractive)
        
        queue1.async {
            for i in 0...10 {
                print("??",i)
            }
        }
        
        queue2.async {
            for i in 0...10 {
                print("??",i)
            }
        }
        // 結果:大致會"均勻交叉"執行兩個代碼塊
    //兩個隊列優先級不相同
        let queue1 = DispatchQueue(label: "test1", qos: .background)
        let queue2 = DispatchQueue(label: "test2", qos: .userInteractive)
        
        queue1.async {
            for i in 0...10 {
                print("??",i)
            }
        }
        
        queue2.async {
            for i in 10...20 {
                print("??",i)
            }
        }
        // 結果:下面的代碼塊先執行(測試發現這個好像并不穩定~~~)

并發隊列

let queue = DispatchQueue(label: "test",qos: .utility)
        
        queue.async {
            for i in 0..<10 {
                print("??",i)
            }
        }
        
        queue.async {
            for i in 0..<10 {
                print("??",i)
            }
        }
        //結果 按順序執行
let queue = DispatchQueue(label: "test",qos: .utility, attributes:.concurrent)
        
        queue.async {
            for i in 0..<10 {
                print("??",i)
            }
        }
        
        queue.async {
            for i in 0..<10 {
                print("??",i)
            }
        }
        //結果  兩個代碼塊并發執行

手動執行

attributes:.initiallyInactive,這樣隊列不會自動執行,需要手動觸發queue.activate() :手動觸發
attributes:[.concurrent,.initiallyInactive] 并發+手動觸發:

延遲執行

  let delayQueue = DispatchQueue(label: "test",qos: .userInitiated)
        print(Date())
        
        let time:DispatchTimeInterval = .seconds(2)
        delayQueue.asyncAfter(deadline: .now() + time) {
             print(Date())
        }
let delayQueue = DispatchQueue(label: "test",qos: .userInitiated)
        print(Date())
        
        delayQueue.asyncAfter(deadline: .now() + 2) {
             print(Date())
        }

DispatchWorkItem

DispatchWorkItem是一個代碼塊,它可以被分到任何的隊列

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

推薦閱讀更多精彩內容