从错误的线程访问领域。 iOS最佳做法

时间:2019-03-05 02:47:15

标签: ios swift iphone realm realm-mobile-platform

我很久以前曾经与Realm合作,但这是第一次遇到这种崩溃

*** Terminating app due to uncaught exception 'RLMException', reason: 'Realm accessed from incorrect thread.'

经过一番搜索,我找到了有关每次您想在另一个Queue中使用新实例时都创建新实例的解决方案。

 backgroundQueue.async {
    print("Dispatched to background queue")
    let realm = try! Realm()
     ....

似乎每次创建新实例以及在后台队列中创建新实例的效率都不高,因此我必须对此进行调整。 有什么办法解决这个问题?

尴尬的是,我确保创建实例并调用它都发生在主线程上!

1 个答案:

答案 0 :(得分:1)

您可以将领域字典用于线程,如下所示:

class RealmWrapper {

    var realm: Realm? {
        return realmsPool.realmForThread(Thread.current)
    }

    var realmsPool = RealmsPool()
}

class RealmsPool {

    var realms = [Thread: Realm]()

    func realmForThread(_ t: Thread) -> Realm? {

        if let realm = realms[t] {
            return realm
        }

        do {
            let newRealm = try Realm(configuration: config)
            self.realms[t] = newRealm
            return newRealm
        } catch {
            fatalError("\(error)")
        }
    }
}