gpt4 book ai didi

ios - Realm Swift iOS - 由于未捕获的异常 'RLMException' 而终止应用程序,原因 : 'Realm accessed from incorrect thread'

转载 作者:行者123 更新时间:2023-11-28 11:13:41 25 4
gpt4 key购买 nike

我在 Swift 2.0 中从 Realm 数据库加载对象时遇到问题。

我打电话:

    var cities = try! Realm().objects(City)

我的应用程序崩溃了,我给了“由于未捕获的异常‘RLMException’而终止应用程序,原因:‘从不正确的线程访问的 Realm ’

有任何示例代码或教程我应该在何时何地调用方法吗?

最佳答案

一个 Realm ,以及该 Realm 中的大多数对象,只能从创建该 Realm 的线程(即您执行类似 let realm = Realm() 的线程)访问。

所以当你创建一个 Realm 时let realm = try Realm()在“线程 A”上,您只能从“线程 A”访问此 Realm 。否则,您将收到 RLMException。

与大多数对象一样,如果您从“线程 A”上的这个 Realm 获取它,例如:var myCars = realm.objects(Car.self) , 那么你只能使用你的 myCars “线程 A”上的对象。

一个快速解决方案,但绝对不是生产质量应用程序的最佳方法,就是将所有内容都放到主队列中。这可以确保您所有的 Realm 内容都发生在同一个线程上,但缺点是如果您正在做一些繁重的工作,它会显着降低您的应用程序的速度。在 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)

然后在这个队列上做你的 Realm 的事情:

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 上花一两个小时来熟悉最佳实践。您可能会找到比我提供的解决方案更好的解决方案。

关于ios - Realm Swift iOS - 由于未捕获的异常 'RLMException' 而终止应用程序,原因 : 'Realm accessed from incorrect thread' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33286612/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com