Swift 在导航到其视图之前多次加载观测对象

Swift 在导航到其视图之前多次加载观测对象,swift,swiftui,swiftui-navigationlink,observableobject,observedobject,Swift,Swiftui,Swiftui Navigationlink,Observableobject,Observedobject,在以下方面有点问题 我在VStack中有一个列表,如下所示: List{ ForEach(fetchRequest.wrappedValue, id: \.self) { city in NavigationLink(destination: CityView(city: city, moc: self.moc)) {

在以下方面有点问题

我在VStack中有一个列表,如下所示:

List{
ForEach(fetchRequest.wrappedValue, id: \.self) { city in
                    
                 NavigationLink(destination: CityView(city: city, moc: self.moc)) {
                            
                            cityRow(city: city)
                 }
                    
         }
}
struct CityView: View {

    @ObservedObject var notificationHandler = NotificationHandler()
    @ObservedObject var city: City
    
    var body: some View {

    }
}
import Foundation
import Combine

class NotificationHandler: ObservableObject {
    
    let nc = NotificationHandler.default
    
    @Published var networkActive: Bool = false
    
    init() {
        nc.addObserver(self, selector: #selector(networkStart), name: Notification.Name("networkingStart"), object: nil)
        nc.addObserver(self, selector: #selector(networkStop), name: Notification.Name("networkingStop"), object: nil)
    }

}
此列表由coreData fetchrequest填充。每个NavigationLinks都导航到CityView并传递一个城市对象

CityView有一个可观察对象“notificationHandler”,定义如下:

List{
ForEach(fetchRequest.wrappedValue, id: \.self) { city in
                    
                 NavigationLink(destination: CityView(city: city, moc: self.moc)) {
                            
                            cityRow(city: city)
                 }
                    
         }
}
struct CityView: View {

    @ObservedObject var notificationHandler = NotificationHandler()
    @ObservedObject var city: City
    
    var body: some View {

    }
}
import Foundation
import Combine

class NotificationHandler: ObservableObject {
    
    let nc = NotificationHandler.default
    
    @Published var networkActive: Bool = false
    
    init() {
        nc.addObserver(self, selector: #selector(networkStart), name: Notification.Name("networkingStart"), object: nil)
        nc.addObserver(self, selector: #selector(networkStop), name: Notification.Name("networkingStop"), object: nil)
    }

}
NotificationHandler()设置NotificationHandler的一个实例,并在init中设置几个通知观察员,如下所示:

List{
ForEach(fetchRequest.wrappedValue, id: \.self) { city in
                    
                 NavigationLink(destination: CityView(city: city, moc: self.moc)) {
                            
                            cityRow(city: city)
                 }
                    
         }
}
struct CityView: View {

    @ObservedObject var notificationHandler = NotificationHandler()
    @ObservedObject var city: City
    
    var body: some View {

    }
}
import Foundation
import Combine

class NotificationHandler: ObservableObject {
    
    let nc = NotificationHandler.default
    
    @Published var networkActive: Bool = false
    
    init() {
        nc.addObserver(self, selector: #selector(networkStart), name: Notification.Name("networkingStart"), object: nil)
        nc.addObserver(self, selector: #selector(networkStop), name: Notification.Name("networkingStop"), object: nil)
    }

}
我的问题是,当应用程序启动到上面列表中的第一个视图时,我得到了大量NotificationHandler实例,列表中的每一行都有一个实例。-这让我相信列表中的导航链接会优先加载它们所持有的城市视图。然而,我相信情况已经不是这样了,懒散负载是一种不受欢迎的行为。此外,在CityView中添加onAppear()表示未完全加载它们

任何帮助都将非常感激,我不知道这是怎么发生的


感谢

NavigationView上的目标不是惰性的,因此它会在创建目标视图后立即初始化目标视图。可以在此处找到一个简单的解决方法:。将目标视图包装在LazyView中。

NavigationView上的目标视图不是惰性的,因此它会在创建目标视图后立即初始化目标视图。可以在此处找到一个简单的解决方法:。将您的目的地视图包装在LazyView中。

希望共享此问题解决方案的最新更新

这是避免创建多个ObservedObject实例的方法

分享这一点是因为在
NavigationLink
中延迟加载并不能解决在运行时根据用户的操作刷新视图会多次创建和销毁
ObservedObject
的问题


因此,我们需要一些解决方案,使我们的对象只创建一次,并且即使在刷新视图后也会保持不变。

希望共享解决此问题的最新更新

这是避免创建多个ObservedObject实例的方法

分享这一点是因为在
NavigationLink
中延迟加载并不能解决在运行时根据用户的操作刷新视图会多次创建和销毁
ObservedObject
的问题


因此,我们需要一些解决方案,其中我们的对象只创建一次,即使在视图被刷新之后也仍然存在。

因此,您有自己的类名为“代码> NoToCICTICECTORION/CODE >,跟踪基础类吗?然后,在自己的类中,使用基础类?如果你给自己的类起一个与现有广泛使用的类不冲突的名字,你会更容易得到帮助。不幸的是没有区别。感谢您的帮助。请改为在顶层创建通知类,并将其作为参数发送到CityView(与OrganizationView相同吗?)或为其创建环境对象。是的,它是相同的。我做了一次编辑,很抱歉造成了混乱。您的意思是在第一个视图中创建它并将其传递给CityView吗?我认为城市景观中的一个可观察对象在激活之前不会被初始化?@JoakimDanielson你的两种方法都有效。再次感谢。因此,您有自己的类名为“代码> NoTeCudiation Clase< /Cl>”,跟踪基础类?然后,在自己的类中,使用基础类?如果你给自己的类起一个与现有广泛使用的类不冲突的名字,你会更容易得到帮助。不幸的是没有区别。感谢您的帮助。请改为在顶层创建通知类,并将其作为参数发送到CityView(与OrganizationView相同吗?)或为其创建环境对象。是的,它是相同的。我做了一次编辑,很抱歉造成了混乱。您的意思是在第一个视图中创建它并将其传递给CityView吗?我认为城市景观中的一个可观察对象在激活之前不会被初始化?@JoakimDanielson你的两种方法都有效。再次感谢。