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对象的线程安全引用,该对象可以通过线程边界传递,然后一旦您安全地进入另一个线程,就会被解析回线程受限对象.我希望这有帮助,如果您还需要其他信息,请告诉我.干杯!