【问题标题】: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?

【问题讨论】:

  • 你的对象是动态的?
  • 不,只是静态对象
  • 你能给我举个例子吗
  • 更新了我的代码

标签: ios swift realm dispatch-queue


【解决方案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 来获取对象?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-04
  • 2014-04-02
相关资源
最近更新 更多