![](/img/trans.png)
[英]How to use DispatchGroup to make asynchronous calls within a for loop
[英]How to use DispatchGroup in a loop with order?
我想按順序保存數據
數據已保存0
保存數據1
保存數據2
....
但實際輸出如下: - 數據保存4
- 數據保存0
- 數據已保存2
- 數據已保存3
- 數據已保存1
我該如何解決這個問題?
提前致謝
var anArray : [String] = []
override func viewDidLoad() {
super.viewDidLoad()
anArray.append("profilFotograflari/070091.jpg")
anArray.append("profilFotograflari/070092.jpg")
anArray.append("profilFotograflari/077111.jpg")
anArray.append("profilFotograflari/077112.jpg")
anArray.append("profilFotograflari/077113.jpg")
anArray.append("profilFotograflari/077115.jpg")
anArray.append("profilFotograflari/079999.jpg")
let myGroup = DispatchGroup()
for i in 0 ..< 5 {
myGroup.enter()
let pathReference = Storage.storage().reference(withPath: "\(anArray[i])")
pathReference.getData(maxSize: 2 * 1024 * 1024) { (data, error) in
if let error = error {
print("An error has occured!")
} else {
print("Data saved \(i)")
myGroup.leave()
}
}
}
myGroup.notify(queue: .main) {
print("Finished all requests.")
}
}
我同意Rob的評論,除非你真的需要,否則你可能不想這樣做,因為它會減慢保存過程。 如果您需要讓它們按順序排列,而您真的想使用DispatchGroup
來執行此操作,則可以執行以下操作:
let group = DispatchGroup()
for i in 0 ..< 5 {
group.enter()
asyncTask { // Use your getData function here
print("Done: \(i)")
group.leave()
}
group.wait()
}
我還會在你的代碼中注意到:
if let error = error { print("An error has occured!") } else { print("Data saved \\(i)") myGroup.leave() }
如果出現錯誤,將不會調用“離開”,並且永遠不會通知您完成。 即使出現錯誤,您也應該leave
這樣您的程序就不會掛起。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.