ios - 从不正确的线程访问的 Realm 。 iOS 最佳实践

标签 ios swift iphone realm realm-mobile-platform

很久以前用过Realm,但是遇到这种crash还是第一次

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

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

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

似乎每次以及在后台队列中创建新实例的效率都不高,所以我必须调整我的代码。 有什么办法可以解决吗?

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

最佳答案

你可以为线程使用 Realm 字典,像这样:

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

关于ios - 从不正确的线程访问的 Realm 。 iOS 最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54994686/

相关文章:

ios - 比较 2 个日期让我在 IOS 中少了 1 天

iphone - 在 Objective-c/iPhone 中使自定义类可序列化?

objective-c - 如何向单元格添加额外的字幕

ios - 从普通 AR View 切换到耳机 AR View

ios - 如何限制分割 View Controller 左侧的 TableView 的大小?

ios - 如何快速取出字符串的一部分

iphone - 将 NSUserDefaults 转换为钥匙串(keychain)?

ios:为照片添加实时滤镜效果

找不到 iOS Metal 默认库

ios - 如何在 ios swift 中显示 icloud 驱动器中的特定文件格式