Задать вопрос
@Gravio

Синхронное выполнение кода SWIFT alamofire?

Нужно реализовать синхронное выполнение кода, проблема заключается то что у меня не один запрос от alamofire, а несколько.

spoiler
bBf4FAo.png
func download_all_audio(lesson: LessonClass)
    {
        Mainlesson = [lesson]
        
        for (tl, l) in Mainlesson[0].cards.enumerated() {
            start_download(url: l.Audio, t:tl) {
                
            }
        }
        
        print("============")
        print(self.Mainlesson[0].cards[0].LocalAudio)
    }

func start_download(url: String, t: Int, completion: @escaping () -> Void)
    {
        guard let url = URL.init(string: url) else {
            print("error url")
            return
        }
        
        let destination = DownloadRequest.suggestedDownloadDestination(for: .documentDirectory)
        
        Alamofire.download(url, to: destination)
            .downloadProgress { progress in
                //print("Download Progress: \(String(progress.fractionCompleted))")
            }
            .responseData { response in
                self.Mainlesson[0].cards[t].LocalAudio = response.destinationURL!.absoluteString
        }
        
        completion()
    }


Нужно чтоб на выходе он выполнил все запросы и потом вывел print (или любое другое действие )
  • Вопрос задан
  • 420 просмотров
Подписаться 2 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 3
doublench21
@doublench21 Куратор тега Swift
Добро пожаловать в мир DispatchQueue или OperationQueue на ваш выбор. Первый легче. Так как сама задача у вас является асинхронной, нужно будет немного поднапрячься. Для DispatchQueue нужно будет использовать барьеры, так как обычная serial очередь не подойдёт.

Кидайте свои наработки, будем обсуждать дальше.
Ответ написан
Комментировать
TheKnight
@TheKnight
Программист
Варианта два:
1. Написать таки идиоматичный асинхроный код с использованием completion handler (не переживай, больно только первый раз). Если тебе надо вызывать несколько запросов цепочкой - можно их вкладывать в completion handler предыдущего запроса. Но в показанном примере я не вижу нужды в этом.
2. Использовать соответствующие библиотеки.

Напомню, что лочить UI тред плохая идея.
Ответ написан
Комментировать
briahas
@briahas
ObjC, Swift, Python
Или, использовать Промисы+Аламофаер
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы