gpt4 book ai didi

ios - 在 SceneDelegate 中分配的 Observable 属性变为 nil

转载 作者:行者123 更新时间:2023-12-01 21:38:43 24 4
gpt4 key购买 nike

在我的 SceneDelegate我分配 UserInfo() 的变量token :
SceneDelegate.swift

class SceneDelegate: UIResponder, UIWindowSceneDelegate {

var window: UIWindow?
@ObservedObject var userInfo = UserInfo()

func sceneWillEnterForeground(_ scene: UIScene) {
// Called as the scene transitions from the background to the foreground.
// Use this method to undo the changes made on entering the background.
InstanceID.instanceID().instanceID { (result, error) in
if let error = error {
print("ERROR fetching remote instance ID: \(error)")
} else if let result = result {
print("REMOTE instance ID token: \(result.token)")
self.userInfo.token = result.token
}
}
模型.swift
class UserInfo: ObservableObject {
@Published var token: String? = nil{
didSet(newValue){
print("NEW value:\(newValue)")
}

}
}
print("NEW value:\(newValue)")然后成功打印新值。但是,当我访问 token在另一个模型中,它是 nil :
class Search: ObservableObject {
let db = Firestore.firestore()
lazy var functions = Functions.functions()
let settings = UserSettings()
@ObservedObject var userInfo = UserInfo()
@ObservedObject var locationManager = LocationManager()
@Published var status = Status.offline

func getUserData() -> [String:Any?]? {
guard let birthday = UserDefaults.standard.string(forKey: "birthday"), let latitude = locationManager.location?.coordinate.latitude, let longitude = locationManager.location?.coordinate.longitude else {
print("BDAY \(UserDefaults.standard.string(forKey: "birthday"))")
print("LOCATION \(locationManager.location?.coordinate.latitude)")
print("TOKEN \(self.userInfo.token)") // prints nil
return nil
}
guard let fcmToken = self.userInfo.token else {
return nil
}
为什么是这样? userInfo.token仅在应用程序启动时在 SceneDelegate 中分配一次- 所以我不确定为什么它的值会更改为 nil .除非有多个 UserInfo() 的实例- 但是我想 ObservableObject会使其成为“真理的一个来源”吗?

最佳答案

第一名:@ObservedObject仅在 SwiftUI 中有意义 View ,所以只需从您的类中删除该包装器。
第二:您的SceneDelegateSearch创建 UserInfo 的不同实例,因此很明显,更改其中一个不会影响另一个。
解决方案:从提供的快照中不清楚 Search可以引用SceneDelegate , 但你必须注入(inject) SceneDelegate.userInfo进入 Search以某种方式代替后者的创建(通过构造函数参数或通过分配属性)

关于ios - 在 SceneDelegate 中分配的 Observable 属性变为 nil,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62618765/

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