DataResponse
是Alamofire的对象。它返回Decodable
对象和Error
在success中。
要求分别传递接收到的Decodable
对象和Error
。能否将AnyPublisher<DataResponse<T, Error>, Never>
转换为AnyPublisher<T, Error>
.
考虑T
为任意数据类型对象。
func fetchDataViaAlamofire(usingURl url: String) -> AnyPublisher<T, Error> {
return AF.request(url,
method: .get)
.validate()
.publishDecodable(type: T.self)
.map { response in
// ?
// Cannot convert value of type 'DataResponse<T?, AFError>' to closure result type 'T'
response.map { value in
return response.value
}
// ?
// Any way to convert AFError to Error in AnyPublisher<T, Error>
}
.receive(on: DispatchQueue.main)
.eraseToAnyPublisher()
}
首先,您必须在方法的签名中添加通用参数T
。
AF提供了操作符.value()
来转换类型。另外,你必须映射/castAFError
到Error
func fetchDataViaAlamofire<T: Decodable>(usingURL url: String) -> AnyPublisher<T, Error> {
return AF.request(url, method: .get)
.validate()
.publishDecodable(type: T.self)
.value()
.mapError{$0 as Error}
.receive(on: DispatchQueue.main)
.eraseToAnyPublisher()
}