Получаю данные из API youtube с помощью Alamofire. Как передать полученные данные переменной вне функции с запросом?


#1

Получаю данные для отображения в таблице с переиспользуемой ячейкой. Потом часть этих данных нужно передать элементам в ячейке (label и imageview).

func getVideos() {
    Alamofire.request("https://www.googleapis.com/youtube/v3/playlistItems", method: .get, parameters: ["part":"snippet", "playlistId":UPLOADS_PLAYLIST_ID, "key":API_KEY], encoding: URLEncoding.default, headers: nil).responseData { (response) in
        if let err = response.error {
            print("Failed to contact server", err)
            return
        }
        
        guard let data = response.data else {return}
        
            do {
                let result = try JSONDecoder().decode(Result.self, from: data)
                self.result = result
            } catch {
                print(error.localizedDescription)
            }
        
    }
}

если я эту функцию вызывать во viewDidLoad, то переменная result отдает nil. Что делаю не так? Где вызывать функцию с запросом? Пробовал ее вызывать при конфигурировании переиспользуемой ячейки, тоже nil.


#2

вызывайте getVideos() во viewWillAppear


#3

не помогло, по-прежнему nil


#4

обычно completion пишут. Куда возвращают результат запроса.


#5

А как? Можно пример?


#6

вызываю функцию во viewDidLoad (внутри функции прописан print(result) ), следом пишу print(result).

В консоли получаю сначала нужный мне результат (print из функции) , а потом nil из переменной.
Это значит, что функция на момент загрузки данные получила. Дебагер не ругается. Внутри функции данные приходят и передаются в переменную, но за пределам и функции обнуляются. Ничего не понимаю, что делать.


#7

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

Ну и функция должна выглядеть примерно так:

func getVideos(completion: (Result) -> Void) {
    if let err = response.error {
            print("Failed to contact server", err)
            return
        }
        
        guard let data = response.data else {return}
        
            do {
                let result = try JSONDecoder().decode(Result.self, from: data)
                completion(result)
            } catch {
                print(error.localizedDescription)
            }
}