如何在有序循环中使用DispatchGroup?

时间:2019-04-19 19:11:01

标签: swift loops

我想按顺序保存数据

数据已保存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.")
    }

}

1 个答案:

答案 0 :(得分:0)

我同意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'并且永远不会通知您完成。即使出现错误,您也应该leave,以使程序不会挂起。