Swift 3:单身人士的观察员

我想知道是否有任何办法可以观察单身职业的财产变化

在我的情况下,我有这样的东西

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 Object设置一个全屏观察者,但是在Realm GitHub中有一个跟踪问题 ,我相信目前它正在被优先考虑。

Alcivanio是正确的,你需要手动触发一个更新事件,以确保更改持续到领域。 这就是说,因为Realm控制持久化对象中的访问器, didSet一旦对象被保存到领域, didSet不保证被调用。 为了简单起见,我build议使用闭包来更新用户对象。

更新回答:如果你的单身是一个领域Object ,你不能修改其写属性以外的属性。 就像我在下面写的那样,最简单的事情就是拥有一个pipe理Realm写事务的update闭包,并且只需更新其中的Singleton对象的属性即可。

正如你所看到的,你不能使用带有let定义的属性的didSet ,所以最好退回到Objective-C的约定,并使用一个内部的实例variables。

所以,也许考虑这样做:

 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" } 

那么,如果你只有一个用户,你应该把这个观察者放在每个variables中,而不是放在let用户中 。 在那里你可以调用一个用户更新的方法。

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

要写更新的方法,你必须写这样的东西

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

根据你写的内容:

我想实现的是我想在我的应用程序只有一个用户对象,并且任何时候它的任何属性被修改,我想将它保存到领域。

我会build议这个解决scheme:

  1. 创build一个不使用Singleton模式的类。

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

  3. 为用户创build自定义设置器方法。 在这些设置器中,您可以更改用户属性WITH或无需写入数据库。 你也可以检查使用INPUT(设置名称为小写等)。

使用这种方法,您可以轻松testing您的User类,扩展它,子类和重用。

如果你需要下面的代码片段注释=)。