如何在 swiftui 中显示来自自定义 class 的警报?

How do I present an alert from a custom class in swiftui?

在 SwiftUI 中,我在 scenedelegate 中有一个网络请求 运行,scenedidbecomeactive。我不知道当应用程序激活时用户将使用哪个视图,但我想在网络请求中的数据发生变化时发出警报。我简化了下面的代码,所以它很容易阅读...

 func sceneDidBecomeActive(_ scene: UIScene) {
            let customClass = CustomClass()
            customClass.performNetworkRequest()

在 CustomClass 中,我有...

func performNetWorkRequest() {
URLSession.shared.dataTask(with: url) { (data, response, error) in          
      if let d = data {
         let response = try JSONDecoder().decode(DetailResponse.self, from: d)
             DispatchQueue.main.async {
                 //Here is where I want to either present an alert, but I can't figure out how to.
                 //OR do i put a func in SceneDeletegate to present the alert on the window.rootviewcontroller and then just call that func from here?
}

非常感谢任何帮助!

Paul 说的有道理 - 这是一个可能的实现方式:

// In CustomClass.swift

import Combine

class CustomClass : ObservableObject {

    @Published var dataRecieved = PassthroughSubject<DetailResponse, Never>()

    init() {
        performNetWorkRequest()
    }

    func performNetWorkRequest() {
        URLSession.shared.dataTask(with: url) { (data, response, error) in

            let response = try JSONDecoder().decode(DetailResponse.self, from: data)

            DispatchQueue.main.async {
                self.dataRecieved.send(response)
            }
        }
        .resume()
    }
}

// In SomeView.swift

import SwiftUI
import Combine

struct ContentView: View {

    @State var showAlert = false
    var customClass = CustomClass()

    var body: some View {
        Text("Hello, World!")
            .onReceive(customClass.dataRecieved) { _ in
                self.showAlert = true
            }
            .alert(isPresented: $showAlert) {
            // your alert
            }
    }
}

请注意,我没有在其中任何一个中提到 SceneDelegate - 在我看来,这种方法(称为 MVVM)更灵活 - 此外,它的设置方式 performNetWorkRequest()无论如何,将在您的视图初始化后立即执行。 您还可以调整 PassthroughSubject - 我不知道您是否需要 DetailResponse。 希望这对您有所帮助!

编辑:

我刚刚重读了您的问题,您注意到此实现似乎有问题,因为无法知道在网络发生变化的情况下用户会看到什么视图。在这种情况下,您可以在 SceneDelegate 中提供与 EnvironmentObject.

相同的 CustomClass 实例