斯威夫特3:单身人士的财产观察员

时间:2017-01-27 10:16:07

标签: ios swift swift3 realm

我想知道是否有任何办法观察单身人士类的属性变化

在我的情况下,使用Realm我有类似的东西

class User: Object {
   dynamic var name:String = ""
   dynamic var email:String = ""
   dynamic var id:String = ""
   dynamic var picURL:String = ""
   dynamic var pic:Data = Data()

    static let currentUser = User()
    {
        didSet
        {
            try! realm.write {
                realm.add(currentUser, update: true)
            }
    }
  }
}

我想要实现的是我想在我的应用程序中只有一个用户对象,并且只要其任何属性被修改,我想将其保存到Realm。

但是,上面的示例显示错误

  

'让'声明不能观察属性

你会怎么做?您是否认为我的想法是让Realm对象单例并随时更新一些属性更改是一个好主意?

我想知道拥有Realm持久化的类的单例对象是否真的有意义。

3 个答案:

答案 0 :(得分:1)

好吧,如果你只有一个用户,你应该将这个观察者放在每个变量中,而不是放在 let user 中。在那里你可以调用一种方法进行用户更新。

dynamic var name: String {
    didSet{
        User.updateOnRealm()//create this method
    }
}

要编写更新方法,您必须编写类似这样的内容

class func updateOnRealm() {
    //update code here
}

答案 1 :(得分:1)

目前不可能为单个领域Object配备一名观察员,但是有an issue tracking it in the Realm GitHub而我相信

Alcivanio是正确的,因为您需要手动触发更新事件以确保更改持久保存到Realm。话虽这么说,因为Realm控制持久化对象中的访问器,所以一旦将对象保存到Realm,就不能保证调用didSet。为简单起见,我建议使用闭包来更新用户对象。

更新后的答案: 如果您的单身人士是领域Object,则无法在写入交易之外修改其属性。就像我在下面写的那样,最简单的方法是使用一个update闭包来管理Realm写入事务,然后只需更新其中Singleton对象的属性。

正如您所见,您不能将didSetlet定义的属性一起使用,因此最好退回到Objective-C约定并使用内部实例变量。

所以,也许考虑这样做:

fileprivate var _current: User? = nil

class User: Object {
    dynamic var name:String = ""
    dynamic var email:String = ""
    dynamic var id:String = ""
    dynamic var picURL:String = ""
    dynamic var pic:Data = Data()

    static var current: User
    {
        if _current == nil {
            let realm = try! Realm()

            // Query for an existing user
            _current = realm.objects(User.self).first

            // Create a new user if it didn't exist in Realm
            if _current == nil {
                 _current = User()
                 try! realm.write { realm.add(_current) }
            }
        }
        return _current
    }

    public func update(_ block: (() -> Void)) {
        let realm = try! Realm()
        try! realm.write(block)
    }
}

let user = User.current
user.update {
    user.name = "DCDC"
}

答案 2 :(得分:0)

根据你所写的内容:

  

我想要实现的是我想在我的应用程序中只有一个用户对象,并且只要其任何属性被修改,我想将其保存到Realm。

我会建议这个解决方案:

  1. 创建一个不使用Singleton模式的class User

  2. 创建一个符合Singleton模式的class UserManager

  3. A用户创建自定义setter方法。在这些setter中,您可以更改用户属性WITH或WITHOUT写入数据库。您还可以检查使用INPUT(将名称设置为小写等)。

  4. 使用这种方法,您可以轻松地测试User类,扩展它,子类和重用。

    如果您需要以下代码段注释=)。