1. 程式人生 > >[Swift 開發] GCD常用方法

[Swift 開發] GCD常用方法

GCD常用的用法

子執行緒

DispatchQueue.global().async {  
         print("開一條全域性佇列非同步執行任務")   
     }  

主執行緒
DispatchQueue.main.async {  
       print("在主佇列執行任務")  
 }  
   

wait

var myQueue = DispatchQueue(label: "第一條執行緒")
var myQueue2 = DispatchQueue(label: "第二條執行緒")
let group = DispatchGroup()

myQueue.async(group: group, qos: .default, flags: []) {
    for _ in 0...10 {

        print("耗時任務一")
    }
}

myQueue.async(group: group, qos: .default, flags: []) {
    for _ in 0...10 {

        print("耗時任務二")
        sleep(UInt32(3))
    }
}
//等待上面任務執行,會阻塞當前執行緒,超時就執行下面的,上面的繼續執行。可以無限等待 .distantFuture
let result = group.wait(timeout: .now() + 2.0) 
switch result {
case .success:
    print("不超時, 上面的兩個任務都執行完")
case .timedOut:
    print("超時了, 上面的任務還沒執行完執行這了")
}

print("接下來的操作")

notify
let group = DispatchGroup()  
     myQueue?.async(group: group, qos: .default, flags: [], execute: {   
         for _ in 0...10 {  
  
         print("耗時任務一")  
         }  
     })  
     myQueue?.async(group: group, qos: .default, flags: [], execute: {  
         for _ in 0...10 {  
  
             print("耗時任務二")  
         }  
     })  
     //執行完上面的兩個耗時操作, 回到myQueue佇列中執行下一步的任務  
     group.notify(queue: myQueue!) {  
         print("回到該佇列中執行")  
     }  

barrier

myQueue?.async {//任務一  
            for _ in 0...10 {  
                print("......")  
            }  
        }  
        myQueue?.async {//任務二  
            for _ in 0...10 {  
                print("++++++");  
            }  
        }  
  
        // barrier 會等待上面執行完畢再執行下面的,會阻塞當前執行緒  
        //        myQueue?.async(flags:.barrier ,execute: {//1.  
        //            print("000000")  
        //        })  
  
        myQueue?.async(group: nil, qos: .default, flags: .barrier, execute: {//2.  
            print("000000")  
        })  
  
        myQueue?.async {  
            print("111111")  
        }