Asynchronous 通知SwiftUI父/主机视图结束类URLSession任务的正确方法是什么?

Asynchronous 通知SwiftUI父/主机视图结束类URLSession任务的正确方法是什么?,asynchronous,swiftui,combine,Asynchronous,Swiftui,Combine,场景:在类中使用异步会话来访问离线服务器 对于容器视图中请求的每个上下文,通过类枚举访问多个端点 数据在其他端点中以单例类的形式累积,以便通过成员视图更快地访问 每个端点显示一个成员视图 目标:在请求的端点返回要显示的数据后通知父视图;然后填充特定的成员视图 问题:不用说,成员视图总是在接收数据之前呈现 也就是说,它不同步 事实上,查看数据的唯一方法是通过容器视图上的按钮显示成员视图,其中包含所需的数据。这不是我想要的。我希望在选择数据源时自动执行此操作。 我的解决方案:在数据可用后向容器视

场景:类中使用异步会话来访问离线服务器
对于容器视图中请求的每个上下文,通过类枚举访问多个端点
数据在其他端点中以单例类的形式累积,以便通过成员视图更快地访问

每个端点显示一个成员视图

目标:在请求的端点返回要显示的数据后通知父视图;然后填充特定的成员视图

问题:不用说,成员视图总是在接收数据之前呈现
也就是说,它不同步

事实上,查看数据的唯一方法是通过容器视图上的按钮显示成员视图,其中包含所需的数据。这不是我想要的。我希望在选择数据源时自动执行此操作。 我的解决方案:在数据可用后向容器视图发出通知,以便容器视图可以使用数据呈现适当的成员视图

问题:我正在使用发布者订阅场景等待通知,以便显示数据
但我对在容器视图中处理订阅服务器感到困惑

我正在考虑使用**NSNotification**处理程序@Objc函数与发布/订阅
但我在这里混合了命令式和主观范式。 以下代码在收到数据时发布通知:

   case .AppleCountryProvince:
        let url = URL(string: "https://disease.sh/v3/covid-19/apple/countries/Canada")!
        let remoteDataPublisher = URLSession.shared.dataTaskPublisher(for: url)
            .map(\.data)
            .receive(on: DispatchQueue.main)
            .decode(type: DMAppleSubRegion.self, decoder: JSONDecoder())
            .print("AppleSubRegion: ")

        remoteDataPublisher
            .eraseToAnyPublisher()
            .sink(receiveCompletion: { completion in
                switch completion {
                case .finished:
                    print("Publisher Finished")
                case let .failure(anError):
                    Swift.print("\nReceived error: ", anError)
                }
            }, receiveValue: { someValue in
                SingletonData.shared.appleSubRegion = someValue
                NotificationCenter.default.post(name: noteName, object: DataModelType.AppleCountryProvince)
            }).store(in: &cancellables)
以下代码段位于视图的函数中,用于处理通知
这不是开火。
    _ = NotificationCenter.default
        .publisher(for: noteName)
        .sink { note in
            if let source = note.object as? DataSource.DataModelType {
                switch source {
                case .AppleCountries:
                    print("AppleCountries")
                case .AppleCountryProvince:
                    print("AppleCountryProvince")
                case .AppleSubRegions:
                    print("AppleSubRegions")
                case .ILINET:
                    print("ILINET")
                case .CDC:
                    print("CDC")
                case .PHL:
                    print("PHL")

                default:
                    print("Default")
                }
            }
        }
问题:我应该在类和容器视图之间传递发布者变量以启动订阅服务器吗

我理解在同步时间使用@State@绑定的原因/影响。
但是我需要让视图在获取服务器数据的结论时做出异步反应

我不确定是否可以在容器视图中使用传统的NSNotification。
底线:我可以让容器视图对网络会话结束做出反应吗?

我没有完全理解您的场景,也不太确定哪一个是“成员视图”、“容器视图”和“父视图”。。但无论你想要通知什么样的视图,都可以用来收听任何发布者。。。或者,您可以有一个
@EnvironmentObject
@ObservedObject
,当异步发生时,可以使用该对象有条件地显示内容脱离主题,但这是单例模式的错误用法