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数据库
作者:大灰灰iOS
交流群昵称:ios-Swift/Object C开发上架
交流群号: 869685378 找ios马甲包开发者合作,有兴趣请添加Q 51259559
Realm数据库多线程使用技巧
本文介绍了在多线程环境下如何正确处理Realm数据库的调用。 Realm允许并发访问,但禁止跨线程传递Realm对象。建议在每个线程中检查并刷新Realm实例,以确保数据的同步。此外,讨论了自动刷新的时机及其潜在问题,以及在提交写事务时的数据刷新。文章提供了一种在多线程场景下安全使用Realm的方法,通过检测线程并适时刷新数据库,以确保数据一致性。
1085

被折叠的 条评论
为什么被折叠?



