Realm swift线程安全变量

时间:2017-02-16 12:00:42

标签: ios swift multithreading thread-safety realm

我是Realm的新手,我想知道将对象的主键存储在View控制器和对象中作为存储属性是否是个好主意。

class VC: ViewController{
    public var id:Int!
    private var customer:Customer{
        get{
            return DBO.loadCustomer(for: id)
        }
    } 
}
class DBO{
    public static func loadCustomer(for id: Int) -> Customer{
        let realm = try! Realm()
        return realm.object(ofType: Customer.self, forPrimaryKey: id)!
    }
}

我假设这是因为我的应用程序将是线程安全的,因为每次线程将尝试访问客户它将从db获取对象。但我想知道这对单个对象和对象数组是否有效。

1 个答案:

答案 0 :(得分:1)

从Realm 2.2开始,您可以使用线程安全引用(请参阅here):

  

现在,您可以为所有类型创建线程安全引用   以前线程限制在一个Realm中,并在它们之间传递对象   线程变成一个简单的三步过程:

     
      
  1. 使用线程限制对象初始化ThreadSafeReference。
  2.   
  3. 将ThreadSafeReference传递给目标线程或队列。
  4.   
  5. 通过调用在目标Realm上解析此引用   Realm.resolve(_ :)。像往常一样使用返回的对象。
  6.   

来自上面的源代码示例:

let realm = try! Realm()
let person = Person(name: "Jane") // no primary key required
try! realm.write {
  realm.add(person)
}
let personRef = ThreadSafeReference(to: person)
DispatchQueue(label: "com.example.myApp.bg").async {
  let realm = try! Realm()
  guard let person = realm.resolve(personRef) else {
    return // person was deleted
  }
  try! realm.write {
    person.name = "Jane Doe"
  }
}

但是,你的方法也应该可以正常工作。