Search code examples
iosswiftfbsdkuserdefaults

UserDefaults not loading first time


I have a two step login process. On the first screen I save the FB user's details to UserDefaults.

When I load the second ViewController it is supposed to load the user's profile image and username (which I create using "fullname"). It actually works the second time I load the user but never the first time, is there some sort of delay? I already tried UserDefaults.standard.synchronize() but that does nothing. It even prints the details so I know it works...

    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)

and in the new VC after self.performSegue(withIdentifier: "UsernameSegue", sender: self):

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

Solution

  • I think you are setting the value to UserDefaults after performing segue or after the viewDidLoad gets called.

    Steps to try find the issue:

    1. Could you please try set breakpoint and see what goes first and what second?
    2. Try printing from defaults right after you assign there.
    3. Just try getting data not in ViewDidLoad but later. For example on button tap. Just to see if it's there for the 1st time too (but not only for the 2nd)

    Question: where do you set the value to defaults?

    PS: Also I wouldn't use UserDefaults for that, but yeah it's a different question.

    Sorry, that can't provide an exact solution since it requires more info/code from your debugging. Please try the options above. Hope it helps.