Xcode 12中Realm的LinkingObjects作用是什么?什么场景需要使用?
关于Realm中LinkingObjects的作用与适用场景
两种写法的核心区别
你观察到的运行表现一致是正常的:List类型的正向关系本身就自带数据自动维护能力,删除Dog自动从所属Person的dogs列表中移除、新增/修改关联关系自动同步这些特性,和你加不加LinkingObjects完全无关。
两者的唯一差异是反向关系的访问能力:
- 不带
LinkingObjects的Dog类仅支持正向访问:你只能通过Person查他拥有的Dog,反过来拿到任意一个Dog实例,你无法直接知道哪些Person的dogs列表包含了这个Dog,只能手动遍历全量Person做匹配,效率极低。 - 带
LinkingObjects属性的Dog类支持自动反向查询:你只需要访问Dog实例的walkers属性,就能直接得到所有持有该Dog的Person实例,不需要自己写任何查询逻辑,Realm会自动维护关联关系,数据实时准确。
举个实际代码示例,假设你需要实现「查询某只Dog的所有遛狗人」的功能:
- 没有
LinkingObjects时的实现:
let currentDog: Dog = // 拿到当前选中的Dog实例 let allPersons = realm.objects(Person.self) var walkers: [Person] = [] // 遍历所有Person逐一匹配,数据量越大性能越差 for person in allPersons { if person.dogs.contains(currentDog) { walkers.append(person) } }
- 有
LinkingObjects时的实现:
let currentDog: Dog = // 拿到当前选中的Dog实例 let walkers = currentDog.walkers // 一行代码直接得到结果,Realm内部走索引查询,性能极高
适用场景
只要你有**从关系的「被持有端」反向查询「持有端」**的需求,就可以使用LinkingObjects,常见场景包括:
- 子对象需要反查父对象:比如点击Dog详情页要展示所属的Person信息
- 多对多关系反向查询:比如一只Dog可以被多个人遛,随时需要查询关联的所有持有人
- 反向关联逻辑处理:比如删除某只Dog时,需要给所有持有该Dog的Person做数据更新
另外补充一个特性:LinkingObjects是动态查询属性,不会在Realm数据库中存储额外数据,零存储开销,添加该属性不会增加数据库体积,也不会拖慢写入性能。
内容的提问来源于stack exchange,提问作者Zack
相关产品推荐
相关产品推荐

