DispatchGroup操作
最近一個案子有個需求,需要call 2隻API,並且得到2隻API回傳的結果後,才做資料處理及UI顯示。
Result:
可以看到task1執行10秒,task2執行5秒,所以task2先結束了,並沒有按照順序執行
可以看到兩個task按照順序執行了
參考資料:
https://medium.com/@shawnloveapp/dispatchgroup操作-6365cb4f0fdc
做法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
做法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
留言
張貼留言