领域数据同步

时间:2016-10-15 07:42:15

标签: swift realm

请解释一下这种行为。

如果我想使用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?
  }

有没有办法强制同步每个元素的变化?如果存在强制同步,是否有任何不利之处?

1 个答案:

答案 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的主要特征。