Как применить Async / await (как javascript) в iOS Swift? - PullRequest
0 голосов
/ 03 апреля 2019

У меня есть следующая структура кода, как я могу запустить этот код в фоновом потоке и выполнить все методы последовательно в FIFO.

Как ждать, пока функция выполнит все свои операторы, а затем перейти к следующей функции??как этого добиться?Пожалуйста, помогите

Например,


func downloadImagesAndProcess(){
// i need these methods to execute one by one i.e when saveimages completes fully only then call resizeimages
saveImages()
resizeImages()
shareImgs()

}

func saveImages(){

// long asyn tasks

for (index, image) in (self.images.enumerated())! {

     KingfisherManager.shared.retrieveImage(with: URL(string:image.imageFile)!) { result in

                    switch result {
                    case .success(let value):
                    self.saveImageDocumentDirectory(image: value.image, imageName: imgNameStr)

                    case .failure(let error):
                        print(error) // The error happens
                    }

                }

            }

}

func resizeImages(){

// long running tasks

}

func shareimgs(){

//share
}




i need these methods to execute one by one i.e when saveimages completes fully only then call resizeimages

How to wait for function to executes all its statements and then move to next function??
how to achieve this ? please help

1 Ответ

1 голос
/ 03 апреля 2019

Самое простое, что нужно сделать, это вызвать следующий метод внутри завершение предыдущего

func saveImages(){

    let group = DispatchGroup()
    for (index, image) in (self.images.enumerated())! {
        group.enter()
        KingfisherManager.shared.retrieveImage(with: URL(string:image.imageFile)!) { result in
            switch result {
            case .success(let value):
                self.saveImageDocumentDirectory(image: value.image, imageName: imgNameStr)
            case .failure(let error):
                print(error) // The error happens
            }
            group.leave()
        }
    }
    group.notify(queue: .main) {
        // do your stuff, check if every image has been downloaded
        self.resizeImages() // this will be called after the completion of the current task
    }
}

Затем в resizeImages Я полагаю, есть еще один обработчик завершения, внутри этого вы позвоните shareImgs

...