我使用Realm来存储我的模型对象。在我的对象中,我有一个函数,它从自己的属性值生成NSData
。这一代可能很长,所以我想在带有处理程序块的线程中生成NSData
。
我的问题是Realm数据访问只能在Realm创建实体(实际上是主线程)上实现。因此,当我在线程中访问我的RealmObject
属性时,应用程序崩溃。根据Realm的规格,这是正常的。但是根据Realm限制在线程中生成NSData
代的最佳解决方案是什么?
其实我有两个想法:
NSData
。我认为很多Realm用户需要处理线程和Realm,所以你在这种情况下做了什么?
答案 0 :(得分:7)
将对象id传递给在单独线程中运行的代码。在该线程内创建一个Realm实例(let realm = try! Realm()
)并检索您的对象。然后你可以做你的长代并通过回调返回结果。
let objectId = "something"
dispatch_async(queue) {
let realm = try! Realm()
let myObject = realm.objectForPrimaryKey(MyObject.self, key: objectId)
let result = myObject.longOperation()
// call back with results
}
或
let objectRef = ThreadSafeReference(to: myObject)
DispatchQueue(label: "background").async {
let realm = try! Realm()
guard let myObject = realm.resolve(objectRef) else {
return // object was deleted
}
let result = myObject.longOperation()
// call back with results
}