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