swift - 如何修复由于未捕获的异常 'RLMException' 、原因 : 'Realm accessed from incorrect thread.' ? 而终止应用程序

标签 swift search realm rx-swift reactiveui

如何解决此问题由于未捕获的异常“RLMException”而终止应用程序,原因:“从不正确的线程访问 Realm 。”,我花了 2 天寻找此问题的解决方案。我希望有人能帮助我。我尝试调试和跟踪它,发现它成功进入 .subscribe(onNext:) 并读取 controller?.tableView.reloadData() 但如果我继续程序执行它只会终止并在控制台日志中显示错误。

        searchBar
            .rx.text
            .orEmpty
            .debounce(0.5, scheduler: MainScheduler.instance)
            .distinctUntilChanged()
            .filter { !$0.isEmpty }
            .map({ [weak controller = self] query -> (tcb: [TrialCourtBranches], query: String)? in
                switch controller?.tcbArray {
                case .some(let array):
                    return (array, query)
                case .none:
                    return nil
                }
            })
            .observeOn(ConcurrentDispatchQueueScheduler(qos: .userInitiated)) // change thread before filtering
            .map({ (query) -> [TrialCourtBranches] in // filter and return the result of filtering
                let realm = try! Realm()
                let tcb = realm.objects(TrialCourtBranches.self)
                let tcb_safe = ThreadSafeReference(to: tcb)
                let filtered = realm.resolve(tcb_safe)
                let tcb_filtered:[TrialCourtBranches] = (filtered?.filter({ $0.branch_name.lowercased().contains(searchText.lowercased()) }))!
                return tcb_filtered
            })
            .observeOn(MainScheduler.instance) // go back to main thread
            .subscribe(onNext: { [weak controller = self] (filtered) in
                tcb_filteredArray = filtered
                controller?.tableView.reloadData()
            })
            .disposed(by: bag)

最佳答案

请注意,我并不是真正的 IOS 开发人员,因此这段代码很容易在语法上出现错误,但问题是这并不是在 Realm 中进行过滤的好方法。

例如,您可以使用 https://github.com/RxSwiftCommunity/RxRealm 中的 RxRealm它允许您将结果公开为可观察的变更集。

然后您可以在其上切换Map(或用您的语言,flatMapLatest)。

所以最终的结果会是这样的

extension UITableView {
  func applyChangeset(_ changes: RealmChangeset) {
    beginUpdates()
    deleteRows(at: changes.deleted.map { IndexPath(row: $0, section: 0) }, with: .automatic)
    insertRows(at: changes.inserted.map { IndexPath(row: $0, section: 0) }, with: .automatic)
    reloadRows(at: changes.updated.map { IndexPath(row: $0, section: 0) }, with: .automatic)
    endUpdates()
  }
}

还有

    searchBar
        .rx.text
        .orEmpty
        .debounce(0.5, scheduler: MainScheduler.instance)
        .distinctUntilChanged()
        .filter { !$0.isEmpty }
        .map({ [weak controller = self] query -> (tcb: [TrialCourtBranches], query: String)? in
            switch controller?.tcbArray {
            case .some(let array):
                return (array, query)
            case .none:
                return nil
            }
        })
        .flatMapLatest({ (query) -> [TrialCourtBranches] in // filter and return the result of filtering
             let realm = try! Realm()
             let results = realm.objects(TrialCourtBranches.self)
                      .filtered($0.branch_name.lowercased()
                      .contains(searchText.lowercased())) 
             return Observable.changeset(from: results)
        })
        .subscribe(onNext: {[unowned self] results, changes in
            if let changes = changes {
                controller?.tableView.applyChangeset(changes)
            } else {
                controller?.tableView.reloadData()
            }
        })
        .disposed(by: bag)

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

相关文章:

Swift2:按值删除对象的数组扩展 - Foundation

Python 在文件中查找、替换或添加字符串

mysql - 搜索查询中最匹配的词

c# - 在 C# 中实现 ImageSearchDLL.dll

c++ - 如何将 BUCK 构建与具有多个同名文件的 pod 一起使用?

react-native - DB Realm -如何访问表和记录

swift - 在 Swift 中创建随机 Bool

不同设备尺寸的 iOS Auto Layout 约束值

swift - 无法将类型 'AuthDataResult?' 的值转换为预期参数类型 'User'

java - 如何为 Realm 中的字段设置默认值?