我有一种特殊的情况,返回函数提供类似于AnyPublisher<Response, Error>的东西。但是从调用函数中,我想返回AnyPublisher<Response, Never>。
//just an example
func getList(_ request: QueryRequest) -> AnyPublisher<Response, Never> {
return executeQuery(request).eraseToAnyPublisher()
}
func executeQuery(_ request: QueryRequest) -> AnyPublisher<Response, Error> {
return someData().eraseToAnyPublisher()
}当我这么做的时候,我得到了Cannot convert return expression of type 'AnyPublisher<Response, Error>' to return type 'AnyPublisher<Response, Never>'
如何在不修改被调用的函数的情况下转换为AnyPublisher<Response, Never>?
注意:我不能修改被调用函数的返回类型,因为其他利用错误的方法使用它
发布于 2020-12-07 06:00:48
要从可能失败的上游发布服务器转换为从不失败的发布服务器,您需要决定如何处理发生错误的情况(因为它不能发送到下游)。
如果您“知道”在特定情况下永远不会发生这种情况,则可以断言不会出现错误:
return executeQuery(request)
.assertNoFailure("this shouldn't have happened")
.eraseToAnyPublisher()或者您可以忽略它(通过捕获它并用Empty发布服务器替换它),这将完成您的管道:
return executeQuery(request)
.catch { _ in Empty<Response, Never>() }
.eraseToAnyPublisher()您还可以用.replaceError(with:)替换错误值。
请注意,当executeQuery发布服务器(上游)出现错误时,它将完成管道,因此下游也将收到一个完成。
您不能像您在评论中所问的那样,继续从错误的上游接收值。如果您认为错误是暂时的(例如,无法访问服务器),则可以考虑重新订阅.retry。
https://stackoverflow.com/questions/65176436
复制相似问题