簡體   English   中英

如何在帶循序的循環中使用DispatchGroup?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM