Realm是否保证写事务内查询始终反映数据库当前内存状态?
问题与验证示例
验证代码
class Item: Object { @objc dynamic var id: UUID = UUID() @objc dynamic var value: Int = 0 override class func primaryKey() -> String? { return "id" } } let realm = try! Realm() try! realm.write { let query1 = realm.objects(Item.self) precondition(query1.isEmpty) let newItem = Item() realm.add(newItem) precondition(query1.contains(newItem)) let query2 = realm.objects(Item.self).filter("value == 12") precondition(query2.isEmpty) newItem.value = 12 precondition(query2.count == 1 && query2[0] == newItem) }
运行上述代码后可观察到,Realm会实时更新查询结果,所有前置条件均能通过。
核心问题
该行为是否有官方保证?即,Realm是否保证:只要在创建查询的同一线程中访问查询,即使变更尚未通过结束写事务提交到磁盘,查询也始终返回符合谓词的对象的当前内存版本?
注:仅询问手动访问查询对象时的行为(例如检查其count或是否包含某对象),不涉及观察者行为——观察者需等到写事务提交后才会被调用。
回答
是的,Realm官方明确保证这种行为。
Realm的查询本质是对数据库状态的实时、惰性求值的视图,而非一次性获取的静态快照。在同一线程的写事务内,所有对Realm对象的修改(包括添加、更新、删除)都会立即反映在已创建的查询结果中。这是因为Realm的对象模型直接映射到内存中的数据结构,写事务内的变更会实时更新这些结构,而查询会直接基于当前内存状态进行求值,无需等待事务提交到磁盘。
这种设计是Realm核心特性的一部分,确保开发者在同一线程内可以依赖查询结果的实时性,无需手动刷新或重新执行查询。
内容的提问来源于stack exchange,提问作者lukas
相关产品推荐
相关产品推荐

