ObservedObject 在导航到其视图之前被多次加载

ObservedObject being loaded multiple times prior to navigation to its view

遇到以下问题。

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

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

此列表是根据 coreData 获取请求填充的。每个 NavigationLinks 导航到 CityView 并传递一个城市对象。

CityView 有一个可观察对象 'notificationHandler' 定义如下:

struct CityView: View {

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

    }
}

NotificationHandler() 设置一个 NotificationHandler 实例,并在 init 中设置一些通知观察者,如下所示:

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 实例 - 列表的每一行都有一个。 - 这让我相信列表中的 NavigationLinks 正在预先加载它们持有的 CityView。但是我相信情况不再如此,延迟加载是默认行为。添加到在 CityView 中添加 onAppear() 表明它们没有被完全加载。

非常感谢任何帮助,我不知道这是怎么回事。

谢谢

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

想分享解决此问题的最新更新。

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

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

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