對Realm數(shù)據庫多線程下被調用的處理

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容