如何将 AnyPublisher<DataResponse<T, Error>, Never> 转换为 AnyPublisher<T, Error>



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()来转换类型。另外,你必须映射/castAFErrorError

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()
}

相关内容

  • 没有找到相关文章

最新更新