如何处理线程和领域? (IOS)

时间:2016-05-30 12:42:14

标签: ios swift multithreading realm dispatch

我使用Realm来存储我的模型对象。在我的对象中,我有一个函数,它从自己的属性值生成NSData。这一代可能很长,所以我想在带有处理程序块的线程中生成NSData

我的问题是Realm数据访问只能在Realm创建实体(实际上是主线程)上实现。因此,当我在线程中访问我的RealmObject属性时,应用程序崩溃。根据Realm的规格,这是正常的。但是根据Realm限制在线程中生成NSData代的最佳解决方案是什么?

其实我有两个想法:

  • 创建一个Realm特定的调度队列,并使我的所有Realm访问权限都在此队列中写入
  • 在临时结构(或一组变量)中获取所有需要的属性,并使用此结构/变量在线程中生成NSData

我认为很多Realm用户需要处理线程和Realm,所以你在这种情况下做了什么?

1 个答案:

答案 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
}