我希望在所有Combine发行商都像DispatchGroup
和.notify
一样完成工作时得到通知。
例如,在下面的代码中,我希望在发布者(pub1
、pub2
(工作时显示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()
}
}
}