一个领域,以及该领域中的大多数对象,只能从创建该领域的线程(即您执行类似let realm = Realm() 的线程)访问。
因此,当您在“线程 A”上创建领域 let realm = try Realm() 时,您只能从“线程 A”访问此领域。否则,你会得到一个 RLMException。
对于大多数对象也是如此,如果您从“线程 A”上的这个领域中获取它,例如:var myCars = realm.objects(Car.self),那么您只能在“线程 A”上使用您的 myCars 对象。
一种快速解决方法,但绝对不是生产质量应用程序的最佳方法,就是将所有内容都放到主队列中。这可以确保您的所有领域内容都发生在同一个线程上,但缺点是如果您正在做一些繁重的工作,它可能会显着减慢您的应用程序。在 swift 3 中,您可以通过以下方式执行此操作:
DispatchQueue.main.async{
do{
//your stuff.
//ex:
let realm = try Realm()
myCars = try realm.objects(Car.self)
if myCars != nil{
try realm.write{
for car in myCars!{
car.drive()
}
}
}
}catch{
print(error)
}
}
更好的解决方案是使用后台队列,然后在需要更新时返回主队列。你可以像这样创建一个后台队列:
let myRealmQueue = DispatchQueue(label: "realmQueue", qos: .background)
然后在这个队列上做你的领域的事情:
myRealmQueue.async{
do{
//Do your realm stuff in this queue.
let realm = try Realm()
myCars = try realm.objects(Car.self)
if myCars != nil{
let numberOfCars = myCars.count
//return to main queue to update UI
DispatchQueue.main.async{
numberOfCarsLabel.text = numberOfCars
}
}
}catch{
print(error)
}
}
如果您对 swift 中的线程不是很熟悉,我建议您至少花一两个小时在 google 上熟悉最佳实践。您可能会找到比我提供的解决方案更好的解决方案。