2016-07-26 71 views
1

我們正在經歷以下崩潰境界verify_thread崩潰

realm::Realm::verify_thread() const (shared_realm.cpp:274) 

它發生零星的,但在我們的代碼不同的流。 一個我們發現蹤跡的是

0x00000001003af7ec realm::Realm::verify_thread() const (shared_realm.cpp:274) 
0x0000000100339d78 RLMGetObjects (RLMObjectStore.mm:83) 
0x0000000100330130 +[RLMObject objectsWithPredicate:] (RLMObject.mm:150) 
0x00000001000fa468 -[PrinterRepository getDefaultPrinter] (PrinterRepository.m:35) 
0x00000001001faf3c -[PrintService handlePrintJobs] (PrintService.m:106) 

我們在[PrinterRepository getDefaultPrinter]代碼

return [[Printer objectsWithPredicate:[NSPredicate predicateWithFormat:@"isDefault == 1"]] firstObject]; 

本地,我們無法重現這個呢,我們只看到從這個時間發生與我們的beta測試人員合作。

我們的境界版本0.102.1

我們的iOS版本是9.2.1,9.3.2 & 9.3.3

是否有人有這個事故的原因的想法?

回答

0

受管領域對象受線程限制。線程之間不允許任意傳遞它們。當你在主線程上檢索一個對象時,你只能在那裏使用它。當你想將它傳遞給後臺線程時,你需要在主線程上檢索一個標識符,最好是指定爲0​​的屬性,並將其傳遞給後臺線程。

只要違反這個規定,你就會失敗。

見我們the relevant chapter of our docs about "Passing Instances Across Threads"

RLMObjects的非託管的情況下表現得完全作爲常規NSObject的子類,並且是安全的跨線程傳遞。

RLMRealm,RLMResults或RLMArray的實例或RLMObject的託管實例只能在創建它們的線程上使用,否則會引發異常*。這是Realm強制執行事務版本隔離的一種方式。否則,如果沒有可能廣泛的關係圖,在不同事務版本的線程之間傳遞對象時,將無法確定應該做什麼。

相反,有幾種方法可以用線程之間可以安全傳遞的方式表示實例。例如,具有主鍵的對象可以用其主鍵的值表示;或者RLMResults可以由其NSPredicate或查詢字符串表示;或者RLMRealm可以由其RLMRealmConfiguration來表示。目標線程可以使用其線程安全表示重新獲取RLMRealm,RLMObject,RLMResults或RLMArray。請記住,重新獲取會在目標線程的版本中檢索實例,這可能與原始線程不同。

+1

感謝您的答案,但它不是100%清楚我對自己做錯了什麼。發生此問題時,我們正在調用'objectsWithPredicate'或'allObjects'。我們沒有將結果對象傳遞給另一個線程,因爲崩潰發生在返回結果之前。或者我們解釋堆棧跟蹤是否錯誤? – areander