【问题标题】:Realm incorrect thread access crash领域不正确的线程访问崩溃
【发布时间】:2017-02-02 12:49:57
【问题描述】:

我参加这个聚会迟到了,我是 Realm 的新手

我创建了一个具有以下编写方法的signleton类,但由于线程访问不正确,它有时会崩溃

让我知道我在这里做错了什么。

 func save<T:Object>(_ realmObject:T) {
    let backgroundQueue = DispatchQueue(label: ".realm", qos: .background)
    backgroundQueue.async {
        let realm = try! Realm()
       try! realm.write {
            realm.add(realmObject)

        }
    }

}

【问题讨论】:

    标签: ios multithreading asynchronous realm


    【解决方案1】:

    感谢您提出这个问题!错误的线程访问异常是 Realm 对象通过线程边界的结果。我建议阅读Passing Instances Across Threadsthis blog post 上的文档(特别是关于线程限制的部分)。

    为了避免该异常,您需要将代码更改为:

    func save<T:Object>(_ realmObject:T) {
        let realmObjectRef = ThreadSafeReference(to: realmObject)
        let backgroundQueue = DispatchQueue(label: ".realm", qos: .background)
        backgroundQueue.async {
            guard let realmObject = realm.resolve(realmObjectRef) else {
                return // although proper error handling should happen
            }
    
            let realm = try! Realm()
            try! realm.write {
                realm.add(realmObject)
            }
        }
    }
    

    ThreadSafeReference 对象documented here 为给定 Realm 对象提供了一个线程安全引用,该对象可以通过线程边界然后解析回线程受限对象一次你安全地在另一个线程中。我希望这会有所帮助,如果您需要其他任何东西,请告诉我。干杯!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-06
      • 2017-09-23
      • 1970-01-01
      • 2019-08-04
      • 1970-01-01
      相关资源
      最近更新 更多