我在Swift 2.0中从Realm数据库加载对象时遇到问题。
我打电话:
var cities = try! Realm().objects(City)
我的应用程序崩溃了,我给了 "由于未捕获的异常终止应用程序' RLMException',原因:' Realm从错误的线程访问"
我应该何时何地调用方法,是否有任何示例代码或教程?
答案 0 :(得分:3)
领域以及该领域中的大多数对象只能从创建此领域的线程(即您执行类似let realm = Realm()
的线程)访问。
因此,当您在'主题A'上创建领域let realm = try Realm()
时,您只能从'主题A'中访问此领域。否则,您将获得RLMException。
同样对于大多数对象,如果你从这个领域中获取它,例如:var myCars = realm.objects(Car.self)
,那么你只能在&#上使用你的myCars
对象39;线程A'。
快速修复,但绝对不是生产质量应用程序的最佳方法,只是将所有内容放入主队列。这可以确保您所有的领域内容都出现在同一个线程中,但如果您正在做一些繁重的工作,那么会严重降低您的应用程序的速度。在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上花费至少一两个小时来熟悉最佳实践。您可能会找到比我提供的更好的解决方案。