Swiftui 当视图消失时,如何使用combine framework定义ViewModel

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

我在viewModels中使用Combine来更新视图。但是,如果我将anycancelable对象存储到一组anycancelable中,则永远不会调用deinit方法。我使用Denit来取消所有可取消的对象

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,但不会销毁旧的viewmodel
viewText
属性在每个实例上更新为
状态。$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)" }
}