Realm是一個非常方便的數(shù)據庫,但是也有其局限性。正如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,若想使用其最新數(shù)據,需要調用[RLMRealm refresh]方法,或者將RLMRealm的autorefresh參數(shù)設為YES。
而官方文檔提到:
Realms are automatically refreshed at the start of every runloop iteration
autorefresh讓Realm在每個runloop循環(huán)開始的時候自動刷新,所以一般不推薦設置為自動刷新。
[RLMRealm commitWriteTransaction]方法被調用的時候Realm數(shù)據也將被刷新。
所以在一個類調用Realm數(shù)據時,可以這樣處理:
- (RLMObject *)RLMObj {
@synchronized (RLMObj) {
if (!_RLMObj || _RLMObjTread != [NSThread currentThread]) {
[[RLMRealm defaultRealm] refresh];
_RLMObjTread = [NSThread currentThread];
_RLMObj = [RLMObj objectsWhere:@"pid = '12345"];
}
return _RLMObj;
}
}
使用一個變量存儲當前Realm對象的線程,當線程不一致時,刷新數(shù)據庫重取,即可在多線程的情況下愉快的使用Realm數(shù)據庫
附上Realm關于線程的官方文檔:https://realm.io/docs/objc/latest/#threading
...
簡書已經棄用,歡迎移步我的小專欄:
https://xiaozhuanlan.com/dahuihuiiOS