Realm 的线程问题
人人都说Realm好,逼格又够高,于是我也试试水,后来发现……线程是个坑,一不小心就进去了。
线程
- 每个程序都会至少有一个线程,如果只有一个线程,那么这个线程就是程序自己本身。
- 线程有三种状态分别是:
就绪
、阻塞
、运行
。 - 在一个进程包括多个线程
Realm中的线程问题
单线程
在单线程中,随便怎么玩都可以,只要注意把修改操作写到事务中。
多线程
对于还没有保存到数据库的RLMObject
,其表现是和普通的NSObject
没什么卵区别的,都是不用注意任何线程相关的问题。
但是对于RLMObject
、RMLResults
、RMLArray
、RMLRealm
已保存到数据库的实例只能够在其被创建的线程上使用,否则就GG。
跨线程操作实例
既然在多线程中,RLMXXX
对象只能在其创建的线程中操作,又如何在别的线程操作呢?根据在官方的文档的理解就是:通过传递对象的唯一标识(主键,NSPredicate,Configuration)来给目标线程重新从数据库中获取对应的数据。
某些属性和方法可以在任意线程中进行访问
RLMRealm
: 所有的属性、类方法和构造器;all properties, class methods, and initializers.RLMObject
: invalidated、objectSchema、realm,以及所有的类方法和构造器;RLMResults
: objectClassName 和 realm;RLMArray
: invalidated、objectClassName 和 realm。