2017-04-27 61 views
0

所以有很多相同的問題,但他們都沒有幫助我,這就是爲什麼我再次問同樣的問題, 所以我得到這個異常,而訪問一個RealmObject的數組。當我檢查類似的問題和領域的官方網站,我在每一個問題如何處理從不正確的線程訪問的領域?

領域對象不是線程安全的,並且不能跨線程共享,所以你必須在每個線程/調度隊列得到一個領域實例類似的事情發現你想讀或寫的。

所以我所做的是我訪問它

這裏的一些片斷之前創建的境界的新實例:

 let realm = try! Realm() 
     try! realm.write { 
      realm.add(saveUserCredentials, update: true) 
      } 

我每次訪問的境界之前創建一個新的實例,像我在說以上

仍然我得到了同樣的錯誤,然後我試圖訪問我的領域實例只有MainThread,我做了這樣的事情:

if Thread.isMainThread{ 
    let realm = try! Realm() 
    try! realm.write { 
     realm.add(saveUserCredentials, update: true) 
    } 
}else{ 
    DispatchQueue.main.async { 
     let realm = try! Realm() 
     try! realm.write { 
      realm.add(saveUserCredentials, update: true) 
     } 
    }} 

還是我得到了同樣的錯誤

fatal error: unexpectedly found nil while unwrapping an Optional value libc++abi.dylib: terminating with uncaught exception of type realm::IncorrectThreadException: Realm accessed from incorrect thread. (lldb) 

,我敢肯定我在做什麼是不這樣做的正確方法,併發生了誤差,不是經常, 1的10倍

任何人都可以指出我正要做些什麼來處理這個異常?

+0

是'saveUserCredentials'一個託管對象嗎?它獲得了什麼樣的線程? – EpicPandaForce

+0

@EpicPandaForce你的意思是託管對象?並不清楚在哪個線程獲取,因爲我調用這個方法'saveUserCredentials()',基本上創建這個'saveUserCredentials'對象,我在執行一些異步任務後調用我的方法(他們正在執行一些網絡請求) –

+0

託管對象意味着它已被添加到Realm併成爲託管代理。然後它被綁定到你添加它的領域被打開的線程。您可能想嘗試將'saveUserCredentials'包裝到'ThreadSafeReference'中,儘管這個錯誤可能更爲重要。 – EpicPandaForce

回答

1

領域對象不是線程安全的,不能跨線程共享,因此您必須在每個要讀取或寫入的線程/調度隊列中獲取Realm實例。

境界對象裝置RealmObjectsResultsListLinkingObjects和。 saveUserCredentialsObjectsList的實例吧?所以你不能通過線程通過 saveUserCredentials。爲了解決這個問題,你可以通過ThreadSafeReference把它包起來,然後通過它進行的跨線,或重新獲取saveUserCredentials每個線程以及realm

參見https://realm.io/docs/swift/latest/#threading

0

因爲你的根關心的是如何在領域手柄線程,您可能有興趣使用將領域對象保留在持久層邊界內的value typed api。有pros and cons可能適合您的用例或不適用。根據您的使用情況,您也可以在單個項目的不同部分使用值本地和本地本地類型。

相關問題