领域错误的线程访问崩溃

San*_*osh 1 multithreading asynchronous realm ios

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

        }
    }
Run Code Online (Sandbox Code Playgroud)

}

小智 5

谢谢你提出这个问题!不正确的线程访问异常是Realm对象通过线程边界传递的结果.我建议阅读有关跨线程传递实例此博客文章(特别是有关线程限制的部分)的文档.

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

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)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

此处记录ThreadSafeReference对象为您提供了给定Realm对象的线程安全引用,该对象可以通过线程边界传递,然后一旦您安全地进入另一个线程,就会被解析回线程受限对象.我希望这有帮助,如果您还需要其他信息,请告诉我.干杯!