如何解决Swift将FlatMap返回POST返回AnyPublisher <Void,Error>POST请求
我开始使用Combine,它真的很酷,但是目前我不知道如何解决它。我想使用Combine发出POST请求,因此我必须解码数据,创建我的请求,发送它,然后返回一个
@NgModule({
imports: [ BrowserModule,FormsModule,UtilsModule ],declarations: [ NavBarComponent ],exports:[NavBarComponent ]
})
export class NavBarModule { }
当前我的代码如下:
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($0)
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: $0,basedOnResponse: $1) }
.decode(type: T.self,decoder: JSONDecoder())
.mapError { return self.handle(error: $0,from: urlRequest,object: T.self) }
}
.eraseToAnyPublisher()
}
我尝试了一些映射,但是没有用,我也不知道他要我做什么。也许你们中的一个知道这个问题?谢谢:)
解决方法
您始终可以map
到Void
,这是一个空元组:
return URLSession.DataTaskPublisher(request: request,session: .shared)
.tryMap { try self.throwErrorOrContinue(data: $0,basedOnResponse: $1) }
.decode(type: T.self,decoder: JSONDecoder())
.mapError { return self.handle(error: $0,from: urlRequest,object: T.self) }
.map { _ in return () }
还应将T
限制为Decodable
。
但实际上,我认为postData
应该返回AnyPublisher<T,Error>
。 postData
的调用者应决定如何处理从服务器获取的数据。因此,您应该改为更改postData
的返回类型。例如,如果呼叫者想忽略结果,可以这样做:
Publishers.IgnoreOutput(upstream: postData(...))
这将创建一个Publisher
而不是Never
的{{1}}作为其Void
。发布者只会产生错误。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。