【问题标题】:Load archived value from NSUserDefaults if it doesn't exist by overriding getter如果归档值不存在,则通过覆盖 getter 从 NSUserDefaults 加载归档值
【发布时间】:2016-01-22 08:37:57
【问题描述】:

如果属性未设置,我正在尝试添加一个后备函数来加载类的存档副本。

我的 setter 工作正常,因此它可以存储值(并且所有 NSCoding 都按预期工作),但是如果我尝试在其他任何地方引用它,而不是使用实际的变量属性,它总是在加载来自 NSUserDefaults。

这是我目前所得到的:

public var currentUser: User? {
    get {
        var user = self.currentUser
        // ^ this totally blows it up
        if (user == nil) {
            user = User.init(name: "") as? User
            if let data = NSUserDefaults.standardUserDefaults().objectForKey("currentUser") as? NSData {
                let unarc = NSKeyedUnarchiver(forReadingWithData: data)
                user = unarc.decodeObjectForKey("root") as? User
            }
        }
        return user
    }
    set(value) {
        self.currentUser = value
        NSUserDefaults.standardUserDefaults().setObject(NSKeyedArchiver.archivedDataWithRootObject(value!), forKey: "currentUser")
    }
}

【问题讨论】:

  • 你需要显示用户类声明
  • 为什么?它有几个基本属性和一个 init 方法。我可以添加它,但我现在在移动设备上,无法访问。
  • 因为它需要符合 NSCoding 并且需要保存为 NSData
  • 他们是。 NSCoding 工作正常。问题是当在这里覆盖 getter 时,它总是从 NSUserDefaults 中提取而不是返回 currentUser 实例。

标签: ios swift nscoding nskeyedarchiver nskeyedunarchiver


【解决方案1】:

您的代码发生了什么,在self.currentUser 的getter 中调用self.currentUser。当您为计算属性指定自定义 getter 时,实际上并没有该实例的存储空间,即不会保存该值,而是始终计算该值。 您需要的是另一个实例属性,它可以是私有的,例如 _currentUser 您实际保存该值的位置,并在您的自定义 getter 中签入。


private var _currentUser: User?
public var currentUser: User? {
    get {
        if (_currentUser == nil) {
            _currentUser = User.init(name: "") as? User
            if let data = NSUserDefaults.standardUserDefaults().objectForKey("currentUser") as? NSData {
                let unarc = NSKeyedUnarchiver(forReadingWithData: data)
                _currentUser = unarc.decodeObjectForKey("root") as? User
            }
        }
        return _currentUser
    }
    set(value) {
        _currentUser = value
        NSUserDefaults.standardUserDefaults().setObject(NSKeyedArchiver.archivedDataWithRootObject(value!), forKey: "currentUser")
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-10
    • 2011-09-15
    • 1970-01-01
    • 2020-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-31
    相关资源
    最近更新 更多