thread 和 Realm 怎么处理? (iOS)
How to deal with thread and Realm ? (iOS)
我使用 Realm 来存储我的模型对象。在我的对象中,我有一个函数,它根据自己的属性值生成 NSData
。这一代可能会很长,所以我想在一个 线程中生成我的 NSData
和处理程序块 .
我的问题是 Realm 数据访问只能在 Realm 创建实体(实际上是主线程)上进行。因此,当我在线程中访问我的 RealmObject
属性时,应用程序崩溃。根据 Realm 规范,这是正常的。但是,根据 Realm 限制在线程中生成 NSData
的最佳解决方案是什么?
其实我有两个想法:
- 制作一个领域特定的调度队列,并让我所有的领域访问都写入这个队列
- 在临时结构(或一组变量)中获取所有需要的属性,并使用此 struct/variables 在线程中生成我的
NSData
。
我假设很多Realm用户需要处理线程和Realm,那么你在这种情况下做了什么?
将对象 ID 传递给单独线程中 运行 的代码。在该线程中创建一个 Realm 实例 (let realm = try! Realm()
) 并检索您的对象。然后你可以做你的长生成和 return 带有回调的结果。
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 {
autoreleasepool {
let realm = try! Realm()
guard let myObject = realm.resolve(objectRef) else {
return // object was deleted
}
let result = myObject.longOperation()
// call back with results
}
}
我使用 Realm 来存储我的模型对象。在我的对象中,我有一个函数,它根据自己的属性值生成 NSData
。这一代可能会很长,所以我想在一个 线程中生成我的 NSData
和处理程序块 .
我的问题是 Realm 数据访问只能在 Realm 创建实体(实际上是主线程)上进行。因此,当我在线程中访问我的 RealmObject
属性时,应用程序崩溃。根据 Realm 规范,这是正常的。但是,根据 Realm 限制在线程中生成 NSData
的最佳解决方案是什么?
其实我有两个想法:
- 制作一个领域特定的调度队列,并让我所有的领域访问都写入这个队列
- 在临时结构(或一组变量)中获取所有需要的属性,并使用此 struct/variables 在线程中生成我的
NSData
。
我假设很多Realm用户需要处理线程和Realm,那么你在这种情况下做了什么?
将对象 ID 传递给单独线程中 运行 的代码。在该线程中创建一个 Realm 实例 (let realm = try! Realm()
) 并检索您的对象。然后你可以做你的长生成和 return 带有回调的结果。
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 {
autoreleasepool {
let realm = try! Realm()
guard let myObject = realm.resolve(objectRef) else {
return // object was deleted
}
let result = myObject.longOperation()
// call back with results
}
}