领域错误的线程访问崩溃

时间:2017-02-02 12:49:58

标签: ios multithreading asynchronous realm

我迟到了这个聚会和新手到了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)

        }
    }

}

1 个答案:

答案 0 :(得分:5)

感谢您提出这个问题!不正确的线程访问异常是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对象提供线程安全引用,该对象可以通过线程边界传递,然后解析回线程一旦你安全地进入另一个线程,就可以使用-confined对象。我希望这有帮助,如果您还需要其他信息,请告诉我。干杯!