Swiftui NavigationLink在后台任务完成后删除观察到的对象

Swiftui NavigationLink在后台任务完成后删除观察到的对象,swiftui,combine,swiftui-navigationlink,Swiftui,Combine,Swiftui Navigationlink,每次当我从我的ContentView推到新视图并且ContentVM完成他的工作时,我都有一个问题,那就是取消分配SecondVM 说明 在推到第二个视图后,ContentVM中的任务完成后,observateObject将被解除分配 我的示例代码如下ContentView和`ContentVM: final class ContentVM: ObservableObject { @Published var title = "Start" init() { DispatchQueu

每次当我从我的
ContentView
推到新视图并且
ContentVM
完成他的工作时,我都有一个问题,那就是取消分配
SecondVM

说明

在推到第二个视图后,
ContentVM
中的任务完成后,
observateObject
将被解除分配

我的示例代码如下
ContentView
和`ContentVM:

final class ContentVM: ObservableObject {

@Published var title = "Start"

init() {
    DispatchQueue.main.asyncAfter(deadline: .now() + 5) {
        self.title = "Changed"
    }
  }
}

struct ContentView: View {

  @ObservedObject var vm = ContentVM()

  var body: some View {
    NavigationView {
        VStack {
            NavigationLink(destination: Second()) {
                Text("Go To second")
            }
            Spacer()
                .frame(height: 40)
            Text(vm.title)
        }
      }   
   }
}
Second
SecondVM

final class SecondVM: ObservableObject {

  @Published var name: String = ""

  func getName() {
    DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
        self.name = "TEST"
    }
  }
}

struct Second: View {

  @ObservedObject var vm = SecondVM()

  var body: some View {
    Text(vm.name)
    .padding(50)
        .background(vm.name.isEmpty ? Color.white : Color.black)
        .foregroundColor(Color.white)
        .onAppear {
            self.vm.getName()
    }
  }
}
正如您在视频中看到的,只有当我按到第二个视图时才会出现以下问题。黑色矩形正确显示,并且在完成来自
ContentVM
的任务后,由于解除分配
SecondVM
,此黑色矩形将消失。如何避免这种行为


这里有一个解决方案-使链接目标可平衡,因此当ContentView在自身状态更改时更新时,它不会重新创建目标视图(否则会发生这种情况,并且是观察到的问题的根源)

使用Xcode 11.5b2进行测试

// in ContentView, id can be any type but constant in this case
NavigationLink(destination: Second(id: 1).equatable()) {
    Text("Go To second")
}

// SecondView
struct Second: View, Equatable {
    let id: Int
    static func == (lhs: Second, rhs: Second) -> Bool {
        lhs.id == rhs.id
    }

  @ObservedObject var vm = SecondVM()

  // .. other code