gpt4 book ai didi

ios - 如何获取后台队列中对象的 Realm 结果,然后在主线程上使用它

转载 作者:行者123 更新时间:2023-11-30 11:08:27 25 4
gpt4 key购买 nike

我是 Realm 的新人。我有 db Reaml 并显示从 db 到 Tableview 的一些数据。

我的代码:

class MyRealmObject: Object {
@objc dynamic var id = 0
@objc dynamic var name = ""
@objc dynamic var favorite = false}

class MyViewController: UIViewController, ... {
let realm = try! Realm()
var objectsResult: Results<MyRealmObject>!
...
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)

cell.textLabel?.text = objectsResult[indexPath.row].name
...

return cell
}

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
//searching block
...
DispatchQueue.global().async {
autoreleasepool{
let realm = try! Realm()
var newObjectsResult: Results< MyRealmObject>!
newObjectsResult = realm.objects(Objects.self).sorted(byKeyPath: "name", ascending: true).filter("name beginswith[cd] %@", searchText)
objectsResult = newObjectsResult
DispatchQueue.main.async {
self.tableView.reloadData()
}
}
}

}

在这种情况下我得到了这个错误:

2018-09-22 14:42:48.262734+0800 TestApp[1194:338211] *** Terminating app due to uncaught exception 'RLMException', reason: 'Realm accessed from incorrect thread.'

如何使用从后台线程到主线程的 Realm 对象来重新加载我的表格 View ?

最佳答案

您需要跨线程将实例传递到主线程。您可以使用 ThreadSafeReference 对象来完成此操作。 Realm documentation包含一个示例:

let person = Person(name: "Jane")
try! realm.write {
realm.add(person)
}
let personRef = ThreadSafeReference(to: person)
DispatchQueue(label: "background").async {
autoreleasepool {
let realm = try! Realm()
guard let person = realm.resolve(personRef) else {
return // person was deleted
}
try! realm.write {
person.name = "Jane Doe"
}
}
}

关于ios - 如何获取后台队列中对象的 Realm 结果,然后在主线程上使用它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52454239/

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