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