我想知道是否有任何办法观察单身人士类的属性变化
在我的情况下,使用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持久化的类的单例对象是否真的有意义。
答案 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对象的属性。
正如您所见,您不能将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"
}
答案 2 :(得分:0)
根据你所写的内容:
我想要实现的是我想在我的应用程序中只有一个用户对象,并且只要其任何属性被修改,我想将其保存到Realm。
我会建议这个解决方案:
创建一个不使用Singleton模式的class User
。
创建一个符合Singleton模式的class UserManager
为A
用户创建自定义setter方法。在这些setter中,您可以更改用户属性WITH或WITHOUT写入数据库。您还可以检查使用INPUT(将名称设置为小写等)。
使用这种方法,您可以轻松地测试User
类,扩展它,子类和重用。
如果您需要以下代码段注释=)。