gpt4 book ai didi

ios - 如何在 swift 4 中解决此问题 `Realm accessed from incorrect thread.`

转载 作者:行者123 更新时间:2023-11-28 10:10:42 26 4
gpt4 key购买 nike

我尝试调试并跟踪错误发生在哪一行,我发现错误发生在阅读 print(tcb_filteredArray) 之后,我尝试将 print(tcb_filteredArray) 低于 self.tableView.reloadData() 并进行调试并再次跟踪它,它仍然在 print(tcb_filteredArray)

中发生错误

我的搜索过滤代码

        let realm = try! Realm()
let tcb = realm.objects(TrialCourtBranches.self)
let tcb_safe = ThreadSafeReference(to: tcb)
DispatchQueue.global(qos: .userInitiated).sync {
guard let filtered = realm.resolve(tcb_safe) else{ return }
tcb_filteredArray = filtered.filter({ $0.branch_name.lowercased().contains(searchText.lowercased()) || ($0.loc?.pc?.province.lowercased().contains(searchText.lowercased()))! || ($0.loc?.pc?.city_municipality.lowercased().contains(searchText.lowercased()))! || $0.office_no.lowercased().contains(searchText.lowercased())})
DispatchQueue.main.async {
self.tableView.reloadData()
}
}

最佳答案

默认情况下,Realm 对象只能从创建它们的线程访问。因此,在后台线程上创建的过滤对象数组无法在主线程上直接访问。

Realm 为此提供了几个解决方案 - 请参阅 this blog post了解更多详情。

帖子描述了解决问题的几种方法:

  1. 创建(一个)包含相关数据的非托管 Realm 对象(该问题仅发生在由 Realm 支持的对象上)。
  2. 将数据读出到具有线程安全类型(例如字符串、整数等)的变量中
  3. 使用新的 ThreadSafeReference 类 - 执行以下步骤:

    • 在原始线程中创建引用:
      let personRef = ThreadSafeReference(to: person)

      (其中 person 是 Realm 支持的对象)

    • 在第二个线程 block 中,解析引用:

       let realm = try! Realm()
      guard let person = realm.resolve(personRef) else {
      return // person was deleted
      }

如果您沿着这条路走下去,您需要将数组中的每一项都包装在 ThreadSafeReference 中。

关于ios - 如何在 swift 4 中解决此问题 `Realm accessed from incorrect thread.`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48592952/

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