быстрый запрос alamofire JSON асинхронный - PullRequest
0 голосов
/ 24 февраля 2019

Я пытался отправить запрос на получение JSON от Amazon от Alamofire, но он был асинхронизирован.он возвращается к функции вызывающей стороны до получения ответа от Amazon.

public func getJSON(fileName: String) -> JSON?{
    let url = "http://s3.eu-west-3.amazonaws.com" + fileName
    print(self.json)

    if self.json == nil {
        Alamofire.request(url)
            .responseJSON { response in
                if let result = response.result.value {
                    self.json = JSON(result)
                }

        }
       return self.json
    }
    else{
        return nil
    }
}

public func initTableView(){
    let myJson = AmazonFiles.shared.getJSON(fileName: "/jsonsBucket/myJson.json")
    print(myJson["id"])
}

объект myJson в функции initTableView всегда равен nil.

Как можно решить эту проблему?

Ответы [ 2 ]

0 голосов
/ 24 февраля 2019

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

Обработчик завершения - это код, который мы получаем, чтобы вызывать его, когда он приходитвернуться с этими предметами.Здесь мы можем работать с результатами вызова: проверка ошибок, локальное сохранение данных, обновление пользовательского интерфейса, что угодно.

typealias completionHandler = (JSON?) -> Void // this is your completion handler

public func getJSON(fileName: String, completionHandler: @escaping completionHandler) -> JSON?{
    let url = "http://s3.eu-west-3.amazonaws.com" + fileName
    if self.json == nil {
        Alamofire.request(url)
            .responseJSON { response in
                if let result = response.result.value {
                  completionHandler(json) // this will fire up your completion handler,
                }
        }
    }
    else{
        completionHandler(nil)
    }
}

И вы можете использовать его следующим образом.

getJSON(fileName: "fileName") { (json) in
    // this will fire up when completionhandler clousre in the function get triggered
    //then you can use the result you passed whether its JSON or nil
    guard let result = json  else { return } // unwrap your result and use it
    print(result)
}
0 голосов
/ 24 февраля 2019

Вместо возврата JSON?в сигнатуре метода используйте закрытие завершения следующим образом:

public func getJSON(fileName: String, completion: ((JSON?) -> Void)?) {
    let url = "http://s3.eu-west-3.amazonaws.com" + fileName
    Alamofire.request(url).responseJSON { response in
        if let result = response.result.value {
            completion?(JSON(result))
        } else {
            completion?(nil)
        }
    }
}

И вызовите метод следующим образом:

getJSON(fileName: "/jsonsBucket/myJson.json") { json in
    print(json)
}

Или:

getJSON(fileName: "/jsonsBucket/myJson.json", completion: { json in
    print(json)
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...