如何在后台队列中获取对象的领域结果,然后在主线程上使用它
Posted
技术标签:
【中文标题】如何在后台队列中获取对象的领域结果,然后在主线程上使用它【英文标题】:How get Realm result of objects in background queue, then use it on main thread 【发布时间】:2018-09-22 06:46:57 【问题描述】:我是 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.'
如何使用从后台线程到主线程的领域对象来重新加载我的 tableview?
【问题讨论】:
你的对象是动态的? 不,只是静态对象 你能给我举个例子吗 更新了我的代码 【参考方案1】:您需要将实例跨线程传递到主线程。您可以使用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"
【讨论】:
谢谢,在我的情况下如何使用 ThreadSafeReference 来获取对象?以上是关于如何在后台队列中获取对象的领域结果,然后在主线程上使用它的主要内容,如果未能解决你的问题,请参考以下文章
在私有/后台队列上创建 NSManagedObjectContext:怎么办?