ios - 观察 URLSession 中的environmentObject

标签 ios swift swiftui

我尝试更新 URLSession 中的environmentObject。

我的登录 View 。

struct LoginView: View {
    @EnvironmentObject var env: Env

    ...

    var body: some View {
        Group {
            if env.isLogin {    // 2    but the env.isLogin is still false
                UserView()
            } else {
                VStack {
                    ...
                    Button(action: {
                        self.login(name: self.name, pass: self.pass)
                    }) {
                        Text("Login")
                    }

                    Text("isLogin: \(String(env.isLogin))")
                }
                .padding()
            }
        }
    }

    func login(name: String, pass: String) {
        ...

        URLSession.shared.dataTask(with: request) { data, response, error in
            if let data = data {
                if let decodedResponse = try? JSONDecoder().decode(Response.self, from: data) {
                    DispatchQueue.main.async {
                        ...
                        if ... {
                            self.env.isLogin = true
                            print(self.system.isLogin)    // 1   output true
                        }
                    }

                    return
                }
            }

            print("Fetch failed: \(error?.localizedDescription ?? "Unknown error")")
        }.resume()
    }
}

我的开始 View 。

class Env: ObservableObject {
    @Published var isLogin: Bool = false
}

struct ContentView: View {
    let env = Env()

    var body: some View {
        VStack {
            if env.isLogin {
                UserView()
            } else {
                LoginView()
            }
        }
        .environmentObject(env)
    }
}

我可以确保已在 1 处将 isLogin 更新为 true,但 env 的相关属性未在 2 处对其进行响应。

分辨率

我创建另一个 View LoginToOtherView,并将其替换为ContentView。

struct LoginToOtherView: View {
    @EnvironmentObject var env: Env

    var body: some View {
        Group {
            if env.isLogin {
                UserView()
            }
        }
    }
}

// and in place 2.
if env.isLogin {
    LoginToOtherView()
}

最佳答案

一旦我将提供的代码快照简化为可测试模块,一切都会正常工作。使用 Xcode 11.4beta2 进行测试。

完整的可测试模块:

class Env: ObservableObject {
    @Published var isLogin: Bool = false
}

struct LoginViewEnv: View {
    @EnvironmentObject var env: Env
    var body: some View {
        Group {
            if env.isLogin {
                Text("UserView") // << shown in 2 secs after button click
            } else {
                VStack {
                    Button(action: {
                        self.login(name: "name", pass: "pass")
                    }) {
                        Text("Login")
                    }

                    Text("isLogin: \(String(env.isLogin))")
                }
                .padding()
            }
        }
    }

    func login(name: String, pass: String) {
        // simulate async login
        DispatchQueue.global(qos: .background).asyncAfter(deadline: .now( ) + 2) {
            DispatchQueue.main.async {
                self.env.isLogin = true
                print(self.env.isLogin)
            }
        }
    }
}

struct TestVStackEnv: View {
    let env = Env()

    var body: some View {
        VStack {
            if env.isLogin {
                Text("UserView")
            } else {
                LoginViewEnv()
            }
        }
        .environmentObject(env)
    }
}

struct TestVStackEnv_Previews: PreviewProvider {
    static var previews: some View {
        TestVStackEnv()
    }
}

关于ios - 观察 URLSession 中的environmentObject,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60613987/

相关文章:

swift - 抛出的表达式类型 'Error?' 不符合 'Error' swift 3

swift - 预设节点不与用户触摸的创建节点发生冲突

swift - 跨表单部分对齐 View

ios - 在哪里放置 .register() 方法来设置 UserDefaults 的初始/默认值?

SwiftUI Widget DateStyle 自定义格式

ios - iOS:没有有效的配置文件允许指定的权利

ios - 如何在 swift spritekit 中创建重复片段

ios - graph.facebook.com - 传输安全 block

ios - 如何找到特定iTunes App的SKStoreProductParameterCampaignToken和SKStoreProductParameterAffiliateToken?

ios - 使用代码创建约束 - 出现错误 "Unable to simultaneously satisfy constraints"