美文网首页iOS开发资料收集
对Realm数据库多线程下被调用的处理

对Realm数据库多线程下被调用的处理

作者: 大灰灰iOS | 来源:发表于2016-07-18 20:34 被阅读937次

Realm是一个非常方便的数据库,但是也有其局限性。正如Realm官方文档所述:

Threads
Although Realm files can be accessed by multiple threads concurrently, you cannot hand over Realms, Realm objects, queries, and results between threads.

虽然每个线程都能取到Realm文件,但是这些文件并不能在线程间通信。当你取出一个RealmObject,若想使用其最新数据,需要调用[RLMRealm refresh]方法,或者将RLMRealm的autorefresh参数设为YES。

而官方文档提到:

Realms are automatically refreshed at the start of every runloop iteration

autorefresh让Realm在每个runloop循环开始的时候自动刷新,所以一般不推荐设置为自动刷新。

[RLMRealm commitWriteTransaction]方法被调用的时候Realm数据也将被刷新。

所以在一个类调用Realm数据时,可以这样处理:

- (RLMObject *)RLMObj {
  @synchronized (RLMObj) {
      if (!_RLMObj || _RLMObjTread != [NSThread currentThread]) {
          [[RLMRealm defaultRealm] refresh];
          _RLMObjTread = [NSThread currentThread];
          _RLMObj = [RLMObj objectsWhere:@"pid = '12345"];
      }
      return _RLMObj;
   }
}

使用一个变量存储当前Realm对象的线程,当线程不一致时,刷新数据库重取,即可在多线程的情况下愉快的使用Realm数据库

附上Realm关于线程的官方文档:https://realm.io/docs/objc/latest/#threading

...

简书已经弃用,欢迎移步我的小专栏:
https://xiaozhuanlan.com/dahuihuiiOS

相关文章

网友评论

  • icoder:加锁是一种实现,另一种线程缓存rlm更好
  • 张散愁:请问有demo吗?遇到这个问题了
    大灰灰iOS:@张散愁 官方文档好像有写:smile:
  • Thebloodelves:感觉有点麻烦了,我是用的RBQFetchedResultsController来保证数据是最新的
    Thebloodelves:@who_young RBQFetchedResultsController还有一个坑就是设置代理为某控制器,那个控制器就不会执行delloc。我已经换成了realm自带的数据表监听了
    who_young:跟你分享一下RBQFetchedResultsController 隐藏的巨坑:realm升级时,如果你某个页面用了RBQFetchedResultsController,请先执行【RBQFetchedResultsController deleteCacheWithName:nil]。否则进这个页面app会崩溃,提示没有数据没有迁移,这个错是因为RBQFetchedResultsController缓存的数据并没有迁移。

本文标题:对Realm数据库多线程下被调用的处理

本文链接:https://www.haomeiwen.com/subject/uqycjttx.html