Swiftui 当视图消失时,如何使用combine framework定义ViewModel
我在viewModels中使用Combine来更新视图。但是,如果我将anycancelable对象存储到一组anycancelable中,则永远不会调用deinit方法。我使用Denit来取消所有可取消的对象Swiftui 当视图消失时,如何使用combine framework定义ViewModel,swiftui,state,viewmodel,combine,deinit,Swiftui,State,Viewmodel,Combine,Deinit,我在viewModels中使用Combine来更新视图。但是,如果我将anycancelable对象存储到一组anycancelable中,则永远不会调用deinit方法。我使用Denit来取消所有可取消的对象 struct View1: View { @ObservedObject var viewModel:ViewTextModel = ViewTextModel() @Injected var appActions:AppActions var body: s
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{
@已发布的var viewText:字符串
private var cancelables=Set()
初始化(状态:AppState){
//初始状态
viewText=“查看\(state.view)”
//更新状态
state.$view.removeDuplicates().map{“view\($0)”}.assign(to:\.viewText,on:self)。store(in:&cancelables)
}
脱硝{
cancelables.forEach{$0.cancel()}
}
}
每次重建视图时,都会实例化一个新的viewmodel,但不会销毁旧的viewmodelviewText
属性在每个实例上更新为状态。$view.removeDuplicates().map{“view\($0)”}.assign(to:\.viewText,on:self)。store(in:&cancelables)
如果我没有将可取消对象存储在集合中,则会调用deinit
,但如果当前视图的状态已更改,则不会更新viewText
你有什么想法吗如何在不增加viewmodel实例的情况下管理状态更新
谢谢您可以使用
接收器
而不是分配
:
state.$view
.removeDuplicates()
.sink { [weak self] in self?.viewText = $0 }
.store(in: &cancellables)
但我怀疑这里是否需要联合收割机。只需使用计算属性:
class ViewTextModel: ObservableObject {
@Published var state: AppState
var viewText: String { "view \(state.view)" }
}
使用
sink
而不是assign
解决了我的问题,谢谢。这里的例子故意简单地解释了我的问题。我更喜欢使用viewmodel根据应用程序的状态准备数据。有趣的是,我也有同样的问题(deinit
未调用),我正在使用sink
(非assign
)。我的问题变成了视图中的内存泄漏:
class ViewTextModel: ObservableObject {
@Published var state: AppState
var viewText: String { "view \(state.view)" }
}