创建基础服务的问题 <Alamofire,PromiseKit,Generic>
Issue To Create A Base Service <Alamofire,PromiseKit,Generic>
大家好,我想为我的应用程序创建一个基础 api 服务,但是当我尝试很多不同的方法时,我无法解决我的问题。我必须使用 alamofire、promiseKit 和通用的。
我的第一个解决方案和他的问题:我可以从 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 响应并对其进行解码,但在这个解决方案中我不能 return 数据与 seal.fulfill(data ) 给我 "Cannot convert value of type 'Any' to expected argument type 'T'",当我像这样尝试 seal.fulfill(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.com/services/api/explore/flickr.photos.getRecent 来测试我的代码。我怎样才能解决这个问题?感谢您的帮助
使用 responseDecodable
代替 responseString
或 responseJSON
。
AF.request(...).responseDecodable(of: T.self) { response in
...
}
大家好,我想为我的应用程序创建一个基础 api 服务,但是当我尝试很多不同的方法时,我无法解决我的问题。我必须使用 alamofire、promiseKit 和通用的。
我的第一个解决方案和他的问题:我可以从 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 响应并对其进行解码,但在这个解决方案中我不能 return 数据与 seal.fulfill(data ) 给我 "Cannot convert value of type 'Any' to expected argument type 'T'",当我像这样尝试 seal.fulfill(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.com/services/api/explore/flickr.photos.getRecent 来测试我的代码。我怎样才能解决这个问题?感谢您的帮助
使用 responseDecodable
代替 responseString
或 responseJSON
。
AF.request(...).responseDecodable(of: T.self) { response in
...
}