[英]Swift 3: Property observer for singleton
我想知道是否有任何方法可以观察单例类的属性ony的变化
在我的情况下,使用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。
但是,上面的示例显示错误
'let'声明不能观察属性
你会怎么做? 您是否认为我的想法是让Realm对象单例并随时更新它的某些属性更改是一个好主意?
我想知道拥有Realm持久化的类的单例对象是否真的有意义。
好吧,如果你只有一个用户,你应该把这个观察者放在每个变量中,而不是放在let用户中 。 在那里你可以调用一种方法进行用户更新。
dynamic var name: String {
didSet{
User.updateOnRealm()//create this method
}
}
要编写更新方法,您必须编写类似这样的内容
class func updateOnRealm() {
//update code here
}
目前不可能为单个Realm Object
配备一个单独的观察者,但是在Realm GitHub中跟踪它是一个问题 ,我相信它现在被优先考虑。
Alcivanio是正确的,因为您需要手动触发更新事件以确保更改持久保存到Realm。 话虽如此,因为Realm控制持久化对象中的访问器, didSet
一旦将对象保存到Realm,就不能保证调用didSet
。为简单起见,我建议使用闭包来更新用户对象。
更新的答案:如果您的单例是一个领域Object
,则无法在写入事务之外修改其属性。 就像我在下面写的那样,最简单的方法是拥有一个管理Realm写事务的update
闭包,并且只需更新其中的Singleton对象的属性。
正如你也看到了,你不能使用didSet
与定义的属性let
,所以它可能是最好回落到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"
}
根据你所写的内容:
我想要实现的是我想在我的应用程序中只有一个用户对象,并且任何时候任何属性都被修改,我想将它保存到Realm。
我会建议这个解决方案:
创建一个不使用Singleton模式的class User
。
创建一个符合Singleton模式的class UserManager
为A
User创建自定义setter方法。 在这些setter中,您可以更改用户属性WITH或WITHOUT写入数据库。 您还可以检查使用INPUT(将名称设置为小写等)。
使用这种方法,您可以轻松地测试您的User
类,扩展它,子类和重用。
如果您需要以下代码片段评论=)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.