我有以下結構:
class FileUploadCellViewModel {
@Published var isUploaded: Bool = false
}
class FileUploadScreenViewModel: ObservableObject {
@Published var viewModels: [FileUploadCellViewModel] = []
@Published var isSendButtonEnabled: Bool = false
private var cancellables: Set<AnyCancellable> = []
init() {
let publisher = $viewModels
// ?? return a single publisher with `true` if all `isUploaded` are `true`
}
let isDateCorrectPublisher = ...
publisher
.combineLatest(isDateCorrectPublisher)
.sink {
isSendButtonEnabled = $0 && $1
}
.store(in: &cancellables)
}
}
let screen = FileUploadScreenViewModel()
let viewModel1 = FileUploadCellViewModel()
let viewModel2 = FileUploadCellViewModel()
screen.viewModels.append(viewModel1) // expected: isSendButtonEnabled: false
screen.viewModels.append(viewModel2) // expected: isSendButtonEnabled: false
viewModel1.isUploaded = false // expected: isSendButtonEnabled: false
viewModel2.isUploaded = true // expected: isSendButtonEnabled: false
viewModel1.isUploaded = true // expected: isSendButtonEnabled: true
如何觀察每次插入viewModels陣列并在插入元素后觀察其isUploaded屬性?
我找到了一個方便的工具來收集一系列發布者,也許在這里會有所幫助。
uj5u.com熱心網友回復:
您在正確的軌道上需要一個CombineLatestCollection用于組合isUploaded所有單元格視圖模型的所有值。
我的答案使用您鏈接的文章combineLatest中的運算子。
合并所有發布者后,您只需呼叫allSatisfy即可[Bool]查看所有單元視圖模型是否已完成上傳。
現在唯一缺少的部分是在viewModels陣列更改時更新訂閱 - 您可以通過觀察$viewModel發布者并將更新的陣列傳遞給一個方法來完成此操作,該方法結合了isUploaded更新的視圖模型的屬性。
class FileUploadScreenViewModel {
@Published var viewModels: [FileUploadCellViewModel] = []
@Published var isSendButtonEnabled: Bool = false
private var subscriptions = Set<AnyCancellable>()
init() {
// Whenever the viewModels array changes, set up the subscription on each element of the array
$viewModels.sink { [weak self] viewModels in
self?.bindIsSendButtonEnabled(viewModels: viewModels)
}.store(in: &subscriptions)
}
// Combine all isUploaded values from each element of viewModels and update isSendButtonEnabled accordingly
private func bindIsSendButtonEnabled(viewModels: [FileUploadCellViewModel]) {
let areUploaded = viewModels
.map(\.$isUploaded)
.combineLatest
.map { areUploaded in
areUploaded.allSatisfy { isUploaded in
isUploaded == true
}
}
let isDateCorrectPublisher = Just(true)
areUploaded
.combineLatest(isDateCorrectPublisher)
.map { $0 && $1 }
.assign(to: &$isSendButtonEnabled)
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/526045.html
標籤:迅速结合出版商
