Realm 的线程问题

人人都说Realm好,逼格又够高,于是我也试试水,后来发现……线程是个坑,一不小心就进去了。

线程

  1. 每个程序都会至少有一个线程,如果只有一个线程,那么这个线程就是程序自己本身。
  2. 线程有三种状态分别是:就绪阻塞运行
  3. 在一个进程包括多个线程

Realm中的线程问题

单线程

在单线程中,随便怎么玩都可以,只要注意把修改操作写到事务中。

多线程

对于还没有保存到数据库的RLMObject,其表现是和普通的NSObject没什么卵区别的,都是不用注意任何线程相关的问题。

但是对于RLMObjectRMLResultsRMLArrayRMLRealm已保存到数据库的实例只能够在其被创建的线程上使用,否则就GG。

跨线程操作实例

既然在多线程中,RLMXXX对象只能在其创建的线程中操作,又如何在别的线程操作呢?根据在官方的文档的理解就是:通过传递对象的唯一标识(主键,NSPredicate,Configuration)来给目标线程重新从数据库中获取对应的数据

某些属性和方法可以在任意线程中进行访问

  • RLMRealm: 所有的属性、类方法和构造器;all properties, class methods, and initializers.
  • RLMObject: invalidated、objectSchema、realm,以及所有的类方法和构造器;
  • RLMResults: objectClassName 和 realm;
  • RLMArray: invalidated、objectClassName 和 realm。