如何处理从错误的线程访问的Realm?

时间:2017-04-27 07:15:34

标签: swift3 realm realm-mobile-platform

所以有很多相同的问题,但没有一个帮助我,这就是为什么我再次提出同样的问题, 所以我在访问RealmObject数组时遇到此异常。当我检查类似的问题和Realm的官方网站时,我发现每个问题都有相似的东西

  

Realm对象不是线程安全的,不能跨线程共享,因此您必须在要读取或写入的每个线程/调度队列中获取Realm实例。

所以我所做的是在访问它之前创建了Realm的新实例

这里有一些片段:

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

我在访问领域之前每次创建一个新的实例,就像我在上面所说的那样

我仍然遇到同样的错误然后我试图只在MainThread上访问我的Realm实例,我做了类似的事情:

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)

我非常肯定我正在做的不是正确的做法,并且错误发生的频率不是很高,10次中有1次

任何人都可以指出我为处理此异常而必须做些什么?

2 个答案:

答案 0 :(得分:1)

  

Realm对象不是线程安全的,不能跨线程共享,因此您必须在要读取或写入的每个线程/调度队列中获取Realm实例。

Realm对象表示RealmObjectsResultsListLinkingObjectssaveUserCredentialsObjectsList的实例吗?所以你无法通过 saveUserCredentials跨线程。要解决此问题,您可以按ThreadSafeReference将其换行,然后在线程中传递它,或者重新获取saveUserCredentials每个线程以及realm

另见https://realm.io/docs/swift/latest/#threading

答案 1 :(得分:0)

由于您的根本关注是如何在Realm中处理线程,您可能会对使用value typed api感兴趣,pros and cons将域对象保留在持久层的边界内。有{{3}}可能适合您的用例。您还可以根据用例在单个项目的不同部分中使用value和realm本机类型。