NSUserDefaults不保存在类变量的setter中

时间:2016-06-15 14:48:53

标签: ios xcode nsuserdefaults

当我尝试通过向我的类变量(在本例中为idauthToken变量添加setter来保存到NSUserDefaults时,似乎没有保存这些值。当我运行时断点开启时,idauthToken的吸气剂即使在设置值后也始终返回nil。

class CurrentUser {

    static let defaultInstance = CurrentUser()

    func updateUser(id id: String, authToken: String) {
        self.id = id
        self.authToken = authToken
    }

    var authToken: String? {
        get {
            if let authToken = NSUserDefaults.standardUserDefaults().objectForKey("userAuthToken") {
                return (authToken as! String)
            } else {
                return nil
            }
        }
        set {
            NSUserDefaults.standardUserDefaults().setObject(authToken, forKey: "userAuthToken")
            NSUserDefaults.standardUserDefaults().synchronize()
        }
    }

    var id: String? {
        get {
            if let id = NSUserDefaults.standardUserDefaults().objectForKey("userId") {
                return (id as! String)
            } else {
                return nil
            }
        }
        set {
            NSUserDefaults.standardUserDefaults().setObject(id, forKey: "userId")
            NSUserDefaults.standardUserDefaults().synchronize()
        }
    }
}

但是,当我将行拉出到updateUser函数(更高一级)时,所有函数都按预期工作。

class CurrentUser {

    static let defaultInstance = CurrentUser()

    func updateUser(id id: String, authToken: String) {
        NSUserDefaults.standardUserDefaults().setObject(id, forKey: "userId")
        NSUserDefaults.standardUserDefaults().synchronize()

        NSUserDefaults.standardUserDefaults().setObject(authToken, forKey: "userAuthToken")
        NSUserDefaults.standardUserDefaults().synchronize()
    }

    var authToken: String? {
        get {
            if let authToken = NSUserDefaults.standardUserDefaults().objectForKey("userAuthToken") {
                return (authToken as! String)
            } else {
                return nil
            }
        }
    }

    var id: String? {
        get {
            if let id = NSUserDefaults.standardUserDefaults().objectForKey("userId") {
                return (id as! String)
            } else {
                return nil
            }
        }
    }
}

为什么会这样?我错过了什么? {set}是否在不能访问NSUserDefaults的其他线程/模式下运行?

2 个答案:

答案 0 :(得分:1)

你必须在set方法中使用newValue,值仍为零,或者使用didSet然后你可以使用变量。

答案 1 :(得分:0)

正如Alex所说,你必须在set方法中使用newValue。此外,您可以参考此链接以获取更多详细信息: Store [String] in NSUserDefaults (Swift)