gpt4 book ai didi

ios - 观察 URLSession 中的 environmentObject

转载 作者:行者123 更新时间:2023-12-04 10:26:46 28 4
gpt4 key购买 nike

我试图在我的 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)
}
}

我可以确保已经将 isLogin 更新为 true 1 , 但是 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com