Realm 使用备忘

关于使用 Realm 的一些疑问解答 👉 链接

为对象设置 primary key

重写 Object.primaryKey() 方法

写操作

向一个 realm 对象添加数据对象的操作,必须在一个 write 事务中进行,因为 write 事务会产生不可预计的耗时操作,因此,应尽量减少 write 事务


write 事务是同步并阻塞的

若 Thread A 开始了一个 write 事务,
Thread B 在 Thread A 结束前开始一个 write 事务
两者都在同一个 realm 对象上进行

那么,Thread A 必须完成 write 事务并提交后,Thread B 的 write 事务才能进行

添加对象

向 realm 添加完对象之后,可以继续使用这个对象,并且所有对这个对象的更改都会被存储(但必须是在同一个 write 事务中进行)


任何对对象作出的更改都可以在其他线程中访问到,只要:

  1. 使用的是同一个 realm 对象
  2. write 事务完成了

需要注意的是

write 操作会彼此阻塞,并且,当有多个 write 操作时,会阻塞其所在的线程

因此,推荐将 write 操作放置到一个独立的线程


write 操作进行时,read 操作并不会被阻塞

当对一个 realm 进行 write 操作时,所有其他有关这个数据对象的 realm 都会被通知到,并且作出更新

多线程

可以同时有任意数目的线程访问同一个 Realm 文件,并且由于每个线程都有对应的快照,因此线程之间绝不会产生影响

不能让多个线程都持有同一个 Realm 对象的实例


已归入管理的实例(managed),若需要跨线程,需要使用 realm 提供的 机制

Realm 对象

Realm 文件可以存储在硬盘或者内存上

  • 硬盘上,使用 init(path:) 进行初始化
  • 内存上,使用 Configuraion 进行配置

Realm 实例在内部的实现机制上,会进行缓存,因此,创建相同的 Realm 对象的消耗很小

相同的 Realm 对象是指:使用相同的文件路径或 identifer


若需要确保 Realm 实例彻底被销毁,则需要

  • autoreleasepool {} 块中使用 Realm 的 API
  • 确保没有强引用指向 Realm