如何处理iOS中的线程和Realm?

9
我使用Realm来存储我的模型对象。在我的对象中,我有一个函数,可以从其自身的属性值生成NSData。这个过程可能会很长,因此我想在一个带有处理程序块的线程中生成我的NSData。
我的问题是,Realm数据访问只能在Realm创建实体(实际上是主线程)上进行。因此,当我在一个线程中访问我的RealmObject属性时,应用程序会崩溃。根据Realm规格,这是正常的。但是,如何在受限于Realm的情况下使我的NSData生成在一个线程中?
目前我有两个想法:
- 创建一个特定于Realm的调度队列,并使所有Realm访问都在这个队列中写入。 - 在一个临时结构体(或一组变量)中获取所有需要的属性,并使用这个结构体/变量来在一个线程中生成我的NSData。
我假设很多Realm用户需要处理线程和Realm,那么你在这种情况下怎么做呢?
1个回答

13

将对象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 {

   autoreleasepool {
        let realm = try! Realm()
        guard let myObject = realm.resolve(objectRef) else {
            return // object was deleted
        }

        let result = myObject.longOperation()
        // call back with results
   }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接