【问题标题】:NavigationLink deinit ObservedObject after background task is done后台任务完成后 NavigationLink deinit ObservedObject
【发布时间】:2020-05-11 22:05:34
【问题描述】:

每次我从ContentView 推送到新视图时,我在解除分配SecondVM 时遇到问题,ContentVM 完成了他的工作。

说明

推送到Second视图后,ObservableObjectContentVM中的任务完成后被释放。

我的示例代码如下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)
        }
      }   
   }
}

SecondSecondVM

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()
    }
  }
}

正如您在视频中看到的,只有当我推送到Second 查看时才会出现以下问题。黑色矩形正确显示,然后在完成来自ContentVM 的任务后,这个黑色矩形因为取消分配SecondVM 而消失。如何避免这种行为?

【问题讨论】:

    标签: swiftui combine swiftui-navigationlink


    【解决方案1】:

    这里是解决方案 - 使链接目标相等,因此当 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-21
      • 2017-03-22
      • 1970-01-01
      相关资源
      最近更新 更多