Доступ к области из неверной темы.iOS Best Practice - PullRequest
0 голосов
/ 05 марта 2019

Раньше я работал с Realm очень давно, но впервые столкнулся с этим сбоем

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

После некоторого поиска я нашел решения о создании нового экземпляра каждый раз, когда вы хотите работатьвнутри другой очереди.

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

Кажется неэффективным создание нового экземпляра каждый раз, а также в фоновой очереди, поэтому я должен настроить свой код в соответствии с этим.Есть ли способ решить эту проблему?

Неловко то, что я убедился, что создание экземпляра и его вызов происходят в главном потоке !!!

1 Ответ

0 голосов
/ 05 марта 2019

Вы можете использовать словарь областей для потоков, что-то вроде этого:

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)")
        }
    }
}
...