我在 viewModels 中使用 Combine 来更新视图。但是,如果我将 AnyCancellable 对象存储到一组 AnyCancellable 中,则永远不会调用 deinit 方法。我使用 deinit 取消所有可取消对象。
struct View1: View {
@ObservedObject var viewModel:ViewTextModel = ViewTextModel()
@Injected var appActions:AppActions
var body: some View {
VStack {
Text(self.viewModel.viewText)
Button(action: {
self.appActions.goToView2()
}) {
Text("Go to view \(self.viewModel.viewText)")
}
}
}
}
class ViewTextModel: ObservableObject {
@Published var viewText: String
private var cancellables = Set<AnyCancellable>()
init(state:AppState) {
// initial state
viewText = "view \(state.view)"
// updated state
state.$view.removeDuplicates().map{ "view \($0)"}.assign(to: \.viewText, on: self).store(in: &cancellables)
}
deinit {
cancellables.forEach { $0.cancel() }
}
}
每次重建视图时,都会实例化一个新的视图模型,但不会破坏旧的视图模型。viewText
属性在每个实例上更新state.$view.removeDuplicates().map{ "view \($0)"}.assign(to: \.viewText, on: self).store(in: &cancellables)
如果我不将可取消对象存储在集合中,deinit
则调用但viewText
如果当前视图的状态发生更改则不会更新。
您是否知道如何在不增加视图模型实例的情况下管理状态更新?
谢谢