UserDefaults 没有第一次加载

Posted

技术标签:

【中文标题】UserDefaults 没有第一次加载【英文标题】:UserDefaults not loading first time 【发布时间】:2018-02-24 10:34:34 【问题描述】:

我有一个两步登录过程。在第一个屏幕上,我将 FB 用户的详细信息保存到 UserDefaults。

当我加载第二个 ViewController 时,它应该加载用户的个人资料图像和用户名(我使用“fullname”创建)。它实际上在我第二次加载用户时有效,但从来没有第一次,是否有某种延迟?我已经尝试过UserDefaults.standard.synchronize() 但这无济于事。它甚至可以打印细节,所以我知道它可以工作......

    let userName = fullName.replacingOccurrences(of: " ", with: "_")
    UserDefaults.standard.setValue(userName, forKey: "username")

    if let picture = result["picture"] as? NSDictionary , let data = picture["data"] as? NSDictionary, let url = data["url"] as? String 
        UserDefaults.standard.setValue(url, forKey: "userFBPicURL")

        let username = UserDefaults.standard.value(forKey: "username") as? String
        let profileImage = UserDefaults.standard.value(forKey: "userFBPicURL") as? String

        UserDefaults.standard.synchronize()

        print ("Details are User:",username, "profileImage:",profileImage)

self.performSegue(withIdentifier: "UsernameSegue", sender: self)之后的新VC中:

override func viewDidLoad() 
    super.viewDidLoad()
    if let username = UserDefaults.standard.value(forKey: "username") as? String usernameTextfield.text = username
    if FBSDKAccessToken.current() != nil loadFacebookProfileImage()

【问题讨论】:

第一个sn-p中添加的代码你放在哪里了? 在这种情况下,不建议(错误)使用UserDefaults 作为在控制器之间传递数据的临时存储。将数据存储在UserDefaults 中,但将其在performSegue 中传递给第二个控制器,这样更可靠。和往常一样,永远不要value(forKeyUserDefaults 一起使用,正确的方法是object(forKey,或者在这种情况下甚至是string(forKey。设置器是set(... 不是 setValue(...。并且不要在 Swift 中使用 NSDictionary,使用原生类型。 @hardikparmar 在我的注册方法中 可能是因为你synchronize它只有在你得到图片、数据和url的情况下。设置用户名后尝试synchronize @hardikparmar 没用 :( 【参考方案1】:

我认为您将值设置为 UserDefaults after 执行 segue 或 viewDidLoad 被调用。

尝试查找问题的步骤:

    能否请您尝试设置断点,看看先执行什么,然后执行什么? 分配后立即尝试从defaults 打印。 尝试在 ViewDidLoad 中而不是稍后获取数据。例如点击按钮。只是想看看它是否也是第一次出现(但不仅是第二次)

问题:您在哪里将值设置为默认值?

PS:我也不会为此使用 UserDefaults,但是是的,这是一个不同的问题。

抱歉,这无法提供准确的解决方案,因为它需要您的调试提供更多信息/代码。请尝试以上选项。希望对您有所帮助。

【讨论】:

哇,断点实际上指出它在保存数据之前调用了 segue(这很疯狂,对我来说毫无意义),至少现在知道在哪里寻找问题。原来我太早调用 segue,在 FBAuth 之后错过了一个花括号...... @Brewski 哦,太好了!很高兴你找到它:) 我总是尝试使用断点来解决这种“时间”问题,看看有什么问题。祝你好运!

以上是关于UserDefaults 没有第一次加载的主要内容,如果未能解决你的问题,请参考以下文章

将值保存到 UserDefaults [重复]

reloadAllTimelines 不适用于 UserDefaults

删除 UserDefault 中的套件

错误:试图将堆栈放在不可读的内存中:0x7ffeeafe2af0:使用 userDefaults

Userdefaults 不会加载或保存

立即加载 UserDefaults(应用存储)