DispatchGroup操作

最近一個案子有個需求,需要call 2隻API,並且得到2隻API回傳的結果後,才做資料處理及UI顯示。

做法1: 2隻API沒有前後順序

Code:
print("Group created")

//產生兩個task
let task1 = DispatchQueue(label: "task1")
let task2 = DispatchQueue(label: "task2")

//產生DispatchGroup
let group = DispatchGroup()
group.enter()

task1.async(group: group, qos: .default) {
    print("task1 start")
    sleep(10)
    print("task1 end")
    group.leave()
}

group.enter()
task2.async(group: group, qos: .default) {
    print("task2 start")
    sleep(5)
    print("task2 end")
    group.leave()
}

group.notify(queue: .main, execute:{
    print("All task is done")
    //self.reloadUI()
})

Result:

Group created
task1 start
task2 start
task2 end
task1 end
All task is done

可以看到task1執行10秒,task2執行5秒,所以task2先結束了,並沒有按照順序執行


做法2: API有先後順序,加入group.wait()

print("Group created")

//產生兩個task
let task1 = DispatchQueue(label: "task1")
let task2 = DispatchQueue(label: "task2")

//產生DispatchGroup
let group = DispatchGroup()
group.enter()

task1.async(group: group, qos: .default) {
    print("task1 start")
    sleep(10)
    print("task1 end")
    group.leave()
}

group.wait()
group.enter()

task2.async(group: group, qos: .default) {
    print("task2 start")
    sleep(5)
    print("task2 end")
    group.leave()
}

group.notify(queue: .main, execute:{
    print("All task is done")
    //self.reloadUI()
})

Result:
Group created
task1 start
task1 end
task2 start
task2 end
All task is done

可以看到兩個task按照順序執行了

參考資料:
https://medium.com/@shawnloveapp/dispatchgroup操作-6365cb4f0fdc

留言

這個網誌中的熱門文章

905 懷孕流水帳

Panasonic NP-TM9-W 洗碗機開箱

iOS APP 在背景取得使用者位置(Get location at background)