Как использовать DispatchGroup в цикле с порядком? - PullRequest
0 голосов
/ 19 апреля 2019

Я хочу сохранить данные в таком порядке, как

Данные сохранены 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 голосов
/ 19 апреля 2019

Я согласен с комментарием Роба о том, что вы, вероятно, не захотите этого делать, если вам действительно не нужно, потому что это замедлит процесс сохранения.Если вам НУЖНО привести их в порядок и вы действительно хотите использовать 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, даже если есть ошибка, чтобы ваша программа не зависала.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...