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:
-
创build一个不使用Singleton模式的类。
-
创build一个符合Singleton模式的
class UserManager
-
为用户创build自定义设置器方法。 在这些设置器中,您可以更改用户属性WITH或无需写入数据库。 你也可以检查使用INPUT(设置名称为小写等)。
使用这种方法,您可以轻松testing您的User
类,扩展它,子类和重用。
如果你需要下面的代码片段注释=)。