我参加这个聚会迟到了,而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)
}
}
}
最佳答案
感谢您提出这个问题!错误的线程访问异常是由于Realm对象通过线程边界传递的结果。我建议阅读有关Passing Instances Across Threads和this 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对象的线程安全引用,该引用可以通过线程边界传递,一旦您安全地位于其他线程中,便可以解析回线程受限对象。希望对您有所帮助,让我知道您是否还有其他需要。干杯!
关于ios - Realm 不正确的线程访问崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42002733/