我怎么能等到所有Combine出版商都完成了他们在Swift的工作



我希望在所有Combine发行商都像DispatchGroup.notify一样完成工作时得到通知。

例如,在下面的代码中,我希望在发布者(pub1pub2(工作时显示ProgressView

import Combine
import Foundation
import SwiftUI
struct SwiftUIView: View {
@State var isFinished = false
let pub1 = ["one", "two", "three", "four"].publisher
let pub2 = ["five", "six", "seven", "eight"].publisher
var subscriptions = Set<AnyCancellable>()
var body: some View {
if isFinished {
Text("Hello, World!")
} else {
ProgressView()
}
}

init() {
pub1
.sink { print($0) }
.store(in: &subscriptions)
pub2
.sink { print($0) }
.store(in: &subscriptions)

//         Where should I write this code?
//         isFinished = true
}
}

我的问题是我如何才能等到出版商完成并显示";你好世界"在正确的时间?

有什么我应该知道的吗?如果是,请告诉我。非常感谢。

您可以使用Zip运算符。Zip运营商仅在收到来自所有发布者的事件后发布。另一方面,Merge每次发布时都会发布其中一个发布者,发布新的值。

class ViewModel : ObservableObject {

@Published var isFinished = false
let pub1 = ["one", "two", "three", "four"].publisher
let pub2 = ["five", "six", "seven", "eight"].publisher

private var cancelable = Set<AnyCancellable>()

init() {
pub1.zip(pub2)
.sink(receiveCompletion: { _ in
self.isFinished = true
}, receiveValue: {
print("($0),($1)")
})
.store(in: &cancelable)
}
}
struct SwiftUIView: View {
@StateObject private var model = ViewModel()
var body: some View {
if model.isFinished {
Text("Hello, World!")
} else {
ProgressView()
}
}
}

一种可能的方法是视图模型。在此类merge中,发布者和使用receiveCompletion:参数

class ViewModel : ObservableObject {

@Published var isFinished = false
let pub1 = ["one", "two", "three", "four"].publisher
let pub2 = ["five", "six", "seven", "eight"].publisher

private var subscriptions = Set<AnyCancellable>()

init() {
pub1
.sink { print($0) }
.store(in: &subscriptions)
pub2
.sink { print($0) }
.store(in: &subscriptions)

pub1.merge(with: pub2)
.sink(receiveCompletion: { _ in
self.isFinished = true
}, receiveValue: { _ in  })
.store(in: &subscriptions)
}
}
struct SwiftUIView: View {
@StateObject private var model = ViewModel()
var body: some View {
if model.isFinished {
Text("Hello, World!")
} else {
ProgressView()
}
}
}

最新更新