我为Publisher做了一个扩展,以简化接收器,但是我的后端(不是由我创建的)搞砸了,而且我有一个不应该是错误的自定义错误,我想返回.success。
extension Publisher {
func sinkToResult(_ result: @escaping ((Result<Self.Output, Self.Failure>) -> Void)) -> AnyCancellable {
return sink(receiveCompletion: { completion in
switch completion {
case .failure(let error):
if let error = error as? ApiError, let globalError = error.globalErrors.first, globalError.code == 2233 {
//Here i want to send something like return(.success(true))
}
result(.failure(error))
case .finished:
break
}
},
receiveValue: { output in
result(.success(output))
})
}
}您能帮我创建一个可以在这里返回的自定义Output.Self类型吗?
发布于 2022-09-20 09:00:11
我想你有几个选择:
enum MyResult<T> {
case noError
case object(T)
}然后将func签名更改为:func sinkToResult(_ result: @escaping ((Result<MyResult<Self.Output>, Self.Failure>) -> Void)) -> AnyCancellable
或者您可以包装Result并添加您的特定情况:
enum MyResult<Success, Failure: Error> {
case noError
case result(Result<Success, Failure>)
}并将签名更改为:func sinkToResult(_ result: @escaping ((MyResult<Self.Output, Self.Failure>) -> Void)) -> AnyCancellable。
无论哪种方式,我认为在执行JSON解码时直接处理这个问题会更好。
发布于 2022-09-20 13:39:11
我想你需要的是tryCatch,然后你才能沉下去
func tryCatch<P>(_ handler: @escaping (Self.Failure) throws -> P) -> Publishers.TryCatch<Self, P> where P : Publisher, Self.Output == P.Output苹果文档说:
通过将上游发布服务器替换为另一个发布服务器或抛出新错误来处理来自上游发布服务器的错误。
您可以将其添加为管道中的最后一步:
///...
.tryCatch { error in
if let error = error as? ApiError, let globalError = error.globalErrors.first, globalError.code == 2233 {
return Just(true)
} else {
throw error
}
}如果您希望此发布者根据具体情况(如true或空Array等)返回不同的内容,则很难使其具有通用性。
https://stackoverflow.com/questions/73782442
复制相似问题