Swift 将 return AnyPublisher<Void, Error> 与 FlatMap 合并(POST 请求)
Swift Combine return AnyPublisher<Void, Error> with FlatMap (POST Request)
我开始使用 combine,它真的很酷,但目前我不知道如何修复它。我想使用 combine 发出一个 POST 请求,所以我必须解码数据,创建我的请求,发送它,然后 return 一个
AnyPublisher<Void, Error>
目前我的代码如下所示:
func postData<T>(withURL urlRequest: URLRequest, object: T) -> AnyPublisher<Void, Error> where T: Encodable {
return Just(object)
.encode(encoder: JSONEncoder())
.mapError {
let error = self.classifyError([=15=])
return error
}
.map { data -> URLRequest in
var request = urlRequest
//BUILD REQUEST
return request
}
.flatMap { request in
let dataTaskPublisher: AnyPublisher<URLSession.DataTaskPublisher.Output, URLSession.DataTaskPublisher.Failure> = URLSession.DataTaskPublisher(request: request, session: .shared)
return dataTaskPublisher
.tryMap { try self.throwErrorOrContinue(data: [=15=], basedOnResponse: ) }
.decode(type: T.self, decoder: JSONDecoder())
.mapError { return self.handle(error: [=15=], from: urlRequest, object: T.self) }
}
.eraseToAnyPublisher()
}
他告诉我:
Cannot convert return expression of type 'AnyPublisher<Publishers.FlatMap<_, Publishers.Map<Publishers.MapError<Publishers.Encode<Just<T>, JSONEncoder>, _>, URLRequest>>.Output, Publishers.FlatMap<_, Publishers.Map<Publishers.MapError<Publishers.Encode<Just<T>, JSONEncoder>, _>, URLRequest>>.Failure>' (aka 'AnyPublisher<_.Output, _>')
to return type 'AnyPublisher<Void, Error>'
我尝试了一些映射,但没有用,我不知道他想从我这里得到什么。也许你们中的一个人知道这个问题?谢谢:)
你总是可以 map
到 Void
,这是一个空元组:
return URLSession.DataTaskPublisher(request: request, session: .shared)
.tryMap { try self.throwErrorOrContinue(data: [=10=], basedOnResponse: ) }
.decode(type: T.self, decoder: JSONDecoder())
.mapError { return self.handle(error: [=10=], from: urlRequest, object: T.self) }
.map { _ in return () }
另外 T
应限制为 Decodable
。
但实际上,我认为 postData
应该 return AnyPublisher<T, Error>
。如何处理从服务器获取的数据应该由 postData
的调用者决定。因此,您应该改为更改 postData
的 return 类型。例如,如果调用者想忽略结果,它可以这样做:
Publishers.IgnoreOutput(upstream: postData(...))
这将创建一个 Publisher
,其中 Never
而不是 Void
作为其 Output
。发布者只会产生错误。
我开始使用 combine,它真的很酷,但目前我不知道如何修复它。我想使用 combine 发出一个 POST 请求,所以我必须解码数据,创建我的请求,发送它,然后 return 一个
AnyPublisher<Void, Error>
目前我的代码如下所示:
func postData<T>(withURL urlRequest: URLRequest, object: T) -> AnyPublisher<Void, Error> where T: Encodable {
return Just(object)
.encode(encoder: JSONEncoder())
.mapError {
let error = self.classifyError([=15=])
return error
}
.map { data -> URLRequest in
var request = urlRequest
//BUILD REQUEST
return request
}
.flatMap { request in
let dataTaskPublisher: AnyPublisher<URLSession.DataTaskPublisher.Output, URLSession.DataTaskPublisher.Failure> = URLSession.DataTaskPublisher(request: request, session: .shared)
return dataTaskPublisher
.tryMap { try self.throwErrorOrContinue(data: [=15=], basedOnResponse: ) }
.decode(type: T.self, decoder: JSONDecoder())
.mapError { return self.handle(error: [=15=], from: urlRequest, object: T.self) }
}
.eraseToAnyPublisher()
}
他告诉我:
Cannot convert return expression of type 'AnyPublisher<Publishers.FlatMap<_, Publishers.Map<Publishers.MapError<Publishers.Encode<Just<T>, JSONEncoder>, _>, URLRequest>>.Output, Publishers.FlatMap<_, Publishers.Map<Publishers.MapError<Publishers.Encode<Just<T>, JSONEncoder>, _>, URLRequest>>.Failure>' (aka 'AnyPublisher<_.Output, _>')
to return type 'AnyPublisher<Void, Error>'
我尝试了一些映射,但没有用,我不知道他想从我这里得到什么。也许你们中的一个人知道这个问题?谢谢:)
你总是可以 map
到 Void
,这是一个空元组:
return URLSession.DataTaskPublisher(request: request, session: .shared)
.tryMap { try self.throwErrorOrContinue(data: [=10=], basedOnResponse: ) }
.decode(type: T.self, decoder: JSONDecoder())
.mapError { return self.handle(error: [=10=], from: urlRequest, object: T.self) }
.map { _ in return () }
另外 T
应限制为 Decodable
。
但实际上,我认为 postData
应该 return AnyPublisher<T, Error>
。如何处理从服务器获取的数据应该由 postData
的调用者决定。因此,您应该改为更改 postData
的 return 类型。例如,如果调用者想忽略结果,它可以这样做:
Publishers.IgnoreOutput(upstream: postData(...))
这将创建一个 Publisher
,其中 Never
而不是 Void
作为其 Output
。发布者只会产生错误。