请解释一下这种行为。
如果我想使用Realm更新一些数据,我必须做这样的事情:
let realm = try! Realm()
let theDog = realm.objects(Dog.self).filter("age == 1").first
try! realm.write {
theDog!.age = 3
}
}
但如果我这样做会发生什么:theDog!.age = 3
? Dod数据会不同步吗?我怎样才能在以后更新这个元素?
try! realm.write {
//what I have to write here?
}
有没有办法强制同步每个元素的变化?如果存在强制同步,是否有任何不利之处?
答案 0 :(得分:1)
如果我搞砸了,请原谅我的Swift,我对语法不太熟悉。
虽然我知道这是示例代码,但我实际上并不喜欢它。
let realm = try! Realm()
let theDog = realm.objects(Dog.self).filter("age == 1").first
try! realm.write {
theDog!.age = 3
}
}
查询应位于事务块内,以确保您正在修改对象的最新版本。
let realm = try! Realm()
try! realm.write {
let theDog = realm.objects(Dog.self).filter("age == 1").first
theDog!.age = 3
}
}
现在,我认为您的问题是为什么需要realm.write {
。这是因为您只能在事务中修改托管的RealmObjects。
需要事务来确保特定线程的Realm实例切换到“写入模式”,并且在给定时间只能有一个Realm实例处于“写入模式”。因此,给定Realm实例看到的版本将始终保持一致,并且不会更改 - 仅当Realm将其自身同步到新版本时。
这就是Realm的设计方式,以便您可以在后台线程上轻松创建Realm的新版本,然后自动同步到其他Realm实例。
当提交事务时,当发生此更改时,会向其他线程发送消息(如果他们可以接收消息,则无论如何 - 需要事件循环,例如UI线程有一个)告诉那些线程上的Realm实例自行更新;并调用所有结果集和托管RealmObjects的所有更改侦听器,以指示它们已被更新(如果它们已通过此事务更改)。
因此,要回答您的问题,您更改的属性将在属于同一对象的所有RealmObject中更改。
let realm = try! Realm()
let originalDog = realm.objects(Dog.self).filter("age == 1").first
try! realm.write {
let theDog = realm.objects(Dog.self).filter("age == 1").first
theDog!.age = 3
}
// assuming there is only 1 dog with age==1,
// originalDog!.age will be 3
}
我认为您所说的“强制同步”是Realm的主要特征。