创建基础服务的问题 <Alamofire,PromiseKit,Generic>

问题描述 投票:0回答:1

大家好,我想为我的应用程序创建一个基础api服务,但是当我尝试了很多不同的方法,但我不能解决我的问题,我必须使用alamofire,promiseKit和generic。我必须使用alamofire,promiseKit和generic的。

我的第一个解决方案和他的问题。我可以从api中获取json 但当我尝试解码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.fill(data)给我 "无法将类型'Any'的值转换为预期的参数类型'T'",当我试图seal.fill(data as!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)
            }
        }
    }
}

最后我使用了测试api https:/www.flickr.comservicesapiexploreflickr.photos.getRecent 来测试我的代码。我如何能解决这个问题的?谢谢你的帮助

json swift generics alamofire promisekit
1个回答
0
投票

使用 responseDecodable 而不是 responseStringresponseJSON.

AF.request(...).responseDecodable(of: T.self) { response in
    ...
}
© www.soinside.com 2019 - 2024. All rights reserved.