Проблема для создания базовой службы - PullRequest
0 голосов
/ 23 апреля 2020

Привет всем, я хочу создать базовый API-сервис для своих приложений, но когда я пробую много разных способов, но я не могу решить свои проблемы. Я должен использовать alamofire, promiseKit и generi c.

Мое первое решение и его проблему: я могу получить json из API, но когда я пытаюсь каждый раз декодировать json выходит из строя. Есть код:

func fetchData<T: Codable>(_ page: Int) -> Promise<T> {

    let path = getPath(page)

    return Promise<T> { seal in
        AF.request(path, method: .get).validate(statusCode: 200..<300).responseString { response in
            switch response.result {
            case .success(let data):
                if let json = data.data(using: .utf8) {
                    do {
                        let res = try JSONDecoder().decode(T.self, from: json)
                        print(res)
                        seal.fulfill(res)
                    } catch {
                        print("json serilaztion error")
                        print(error)
                        seal.reject(error)
                    }
                }
            case .failure(let error):
                seal.reject(error)
            }
        }
    }

}

Мое второе решение и проблема: Когда я делаю запрос, я получаю ответ json и декодирую его, но в этом решении я не могу вернуть данные с seal.fulfill ( data) выдает «Невозможно преобразовать значение типа« Any »в ожидаемый тип аргумента« T »», и когда я пытаюсь выполнить seal.fulfill (данные как! T), как это, при запуске приложения всегда происходит сбой. Вот мой код:

    func fetchData<T: Codable>(_ page: Int) -> Promise<T> {

    let path = getPath(page)

    return Promise<T> { seal in
        AF.request(path, method: .get).validate(statusCode: 200..<300).responseJSON { response in
            switch response.result {
            case .success(let data):
                seal.fulfill(data as! T) // Cannot convert value of type 'Any' to expected argument type 'T'
            case .failure(let error):
                seal.reject(error)
            }
        }
    }
}

Наконец, я использую test api https://www.flickr.com/services/api/explore/flickr.photos.getRecent для проверки моего кода. Как я могу решить эту проблему? Спасибо за вашу помощь

1 Ответ

0 голосов
/ 23 апреля 2020

Используйте responseDecodable вместо responseString или responseJSON.

AF.request(...).responseDecodable(of: T.self) { response in
    ...
}
...