【发布时间】:2022-08-24 15:52:34
【问题描述】:
我试图让Zip 两个Publishers 具有两个不同的功能,但它没有按预期工作。我有机会一次失败,一次成功。但即使是成功的,我也没有在sink 中得到成功的回复。这是我的代码,非常感谢帮助。
struct ContentView: View {
@State var buttonTapped = false
@State var cancellable = Set<AnyCancellable>()
var body: some View {
Group {
Text(\"Home\")
}.onAppear {
Publishers.Zip(fetchData1(), fetchData2())
.sink(receiveCompletion: { first in
switch first {
case .failure(let er):
print(er)
case .finished:
print(\"ss\")
}
}, receiveValue: { (a, b) in
print(a, b)
// Not printing success value
}).store(in: &cancellable)
}
}
func fetchData1() -> Future<Bool, ErrorType> {
return Future { promise in
promise(.failure(.error(\"fetchData1 failed\")))
}
}
func fetchData2() -> Future<String, ErrorType> {
return Future { promise in
promise(.success(\"fetchData success \"))
}
}
}
enum ErrorType: Error {
case error(String)
}
-
你真正想要达到的目标是什么?
Zip仅在以下情况下发出值 N两个都第 N 次发出的值。因此,如果它的两个上游都完成了 N 个元素,则一个完成,然后Zip本身也完成了,而无需等待更多元素。这意味着如果您Zip2Futures,其中一个失败,Zip不能发出任何元素,因为它的上游之一失败而没有发出任何值。Zip不是您要寻找的运算符,但是,如果不知道您要解决的实际问题是什么,则很难说出您真正需要哪个运算符。 -
@Dávid Pásztor 感谢您的评论,如果我知道我为什么要在这里发帖?告诉我,如果你能,我该如何处理我的案子。我刚开始使用combine。
-
这就是问题所在,你没有解释什么是你的情况.您刚刚表明某些事情没有按预期工作。请解释您要解决的实际问题。您正在尝试合并 2 个
Publishers,但是如果其中任何一个失败,应该是什么行为?你还想要对方的价值吗?你想在什么时候收到这个值,只要他们中的任何一个发出它,还是只有在两者都发出后? -
我有两个不同的要求,
Case: 1如果第一个请求失败,请不要继续下一个请求。Case: 2甚至 1 都无法继续到第二个请求句柄,以防两者都有错误。我在这两者之间感到困惑。