2016-07-25 78 views
3

我想刷新在後臺線程這樣的境界數據庫: (因爲我有新的web服務數據)是否可以複製Realm對象?

RLMRealm *realm = [RLMRealm defaultRealm]; 
[realm beginWriteTransaction]; 
[realm deleteAllObjects]; // !! 
[Pubs createOrUpdateInRealm:[RLMRealm defaultRealm] withJSONArray:data]; 
[realm commitWriteTransaction]; 

問題是,同時我刪除&續訂境界數據庫中的對象,用戶可以打開一些Detail ViewController,指向一些Realm對象(Pubs),同時它被刪除,所以拋出異常。

我沒有看到這方面的任何解決方案,除了總是當我想訪問的細節控制人及其財產的領域對象,我需要經常做這樣的事情:

(這意味着總能得到領域對象,但也可能失敗)

pub = [Pubs objectsWhere:[NSString stringWithFormat: @"pubId = %lu", (long)_selectedPubId]].firstObject; 

但我沒有使用此解決方案。我想最好的是,如果我能在詳細視圖控制器是這樣的呼籲:

pub = [Pubs objectsWhere:[NSString stringWithFormat: @"pubId = %lu", (long)_selectedPubId]].firstObject; 
pub = [pub safeCopy]; 

所以PubRealmObject可同時刪除,但酒吧對象將單獨存儲在內存(僅適用於目的存取權限的數據屬性)。

那麼有人嘗試類似的東西?

或者甚至可能使用一些iOS SDK方式like this

我只需要像我說的那樣訪問數據屬性,而不是像區域對象方法那樣操作,比如刪除或更新數據庫中的對象。

btw我試圖調用主線程中的Realm數據庫的更新,但問題是需要5-7秒(只有1000個json對象),所以它滯後於應用程序。這就是爲什麼我認爲後臺更新&安全複製對象可能會更好。

但我認爲即使在複製對象時它可能會失敗,那麼對此的解決方案是什麼? (後臺更新與Realm對象的安全訪問)

回答

12

通常情況下,視圖控制器依賴於可以從其下面刪除的數據模型通常不是一個好的設計模式。可以通過檢查其屬性object.invalidated來檢查Realm對象是否已被刪除以避免異常。

在任何情況下,創建一個域對象的一種超然的副本,所有你需要做的是:

RLMObject *copiedObject = [[RLMObject alloc] initWithValue:object]; 

這將使對象的副本,但它不會被插入任何境界實例。請注意,如果對象鏈接到任何其他Realm對象,這些對象也不會被複制;新對象只會指向現有的副本。

但我仍然覺得我需要提一下,你可能只是讓你的實現從你的web服務更新Realm更聰明一點,以避免需要這樣做。

如果您的對象實現a primary key,那麼當您調用createOrUpdateInRealm時,將使用新值更新現有對象。

祝你好運!

+0

您好TiM thx回覆。我會查一下。至於createOrUpdateInRealm方法你是對的,我有同樣的想法,但我想這不會管理已刪除的行。他們會留下。所以我不得不找到哪些被刪除並刪除它們,用戶可以打開刪除的一個項目,情況是一樣的。但是,發生刪除某些數據可能相當少見,這是真的。所以可能我可以選擇那種方式。我再看看吧。 – luky

相關問題