【发布时间】:2021-09-24 07:46:58
【问题描述】:
考虑以下代码:
CurrentValueSubject<Void, Error>(())
.eraseToAnyPublisher()
.sink { completion in
switch completion {
case .failure(let error):
print(error)
print("FAILURE")
case .finished:
print("SUCCESS")
}
} receiveValue: { value in
// this should be ignored
}
只需查看 CurrentValueSubject 初始化程序,就可以清楚地看出该值不需要/无关紧要。
我正在使用这个特定的发布者发出一个异步网络请求,该请求可以通过也可以失败。
由于我对此发布者返回的值不感兴趣(没有),我怎样才能摆脱 receiveValue 闭包?
理想情况下,调用站点代码应如下所示:
CurrentValueSubject<Void, Error>(())
.eraseToAnyPublisher()
.sink { completion in
switch completion {
case .failure(let error):
print(error)
print("FAILURE")
case .finished:
print("SUCCESS ")
}
}
也可能是我应该使用 AnyPublisher 以外的其他东西,所以如果它更适合目的,请随意提出/重写 API。
我能找到的最接近的解决方案是ignoreOutput,但它仍然返回一个值。
【问题讨论】:
-
最后使用
} receiveValue: { _ in }有什么问题。sink的接口契约没有可选参数,所以必须指定参数。 -
你只是对美学很挑剔吗?我认为没有类似的内置功能,但您始终可以在
Publisher扩展中编写不带receiveValue参数的sink重载。另外,请考虑使用Future,而不是CurrentValueSubject。 -
是的,我只是不确定我是否为该任务使用了正确的 API。
AnyPublisher适合这个用例吗?如果没有更好的选择,我会坚持使用} receiveValue: { _ in }的建议。
标签: swift swiftui reactive-programming combine