【问题标题】:How can I filter results using RxSwift, RxRealmDataSources and UISearchController?如何使用 RxSwift、RxRealmDataSources 和 UISearchController 过滤结果?
【发布时间】:2017-09-21 08:00:28
【问题描述】:

我将 RxSwift 与 RxRealm 和 RxRealmDataSources 一起使用。我的领域对象绑定到表视图。我试图找到一种方法来根据输入到搜索栏中的查询来过滤它。你们有没有人做过这样的事情?

class ItemsViewController: UITableViewController {

    let bag = DisposeBag()
    let searchController = UISearchController(searchResultsController: nil)
    let search = BehaviorSubject(value: "")

    override func viewDidLoad() {
        super.viewDidLoad()
        searchController.searchResultsUpdater = self
        definesPresentationContext = true
        tableView.tableHeaderView = searchController.searchBar
        bindTableView()
    }

    func bindTableView() {
        let dataSource = RxTableViewRealmDataSource<Item>(cellIdentifier: "itemCell", cellType: UITableViewCell.self) { cell, ip, item in
            cell.textLabel?.text = item.uuid
        }
        Observable.changeset(from: DataStore.sharedInstance.getObjects(Item.self))
            .bind(to: tableView.rx.realmChanges(dataSource))
            .addDisposableTo(bag)
    }

}

extension ItemsViewController: UISearchResultsUpdating {

    public func updateSearchResults(for searchController: UISearchController) {
        search.onNext(searchController.searchBar.text ?? "")
    }

}

【问题讨论】:

  • 为什么不在Observable.changeset(from: DataStore.sharedInstance.getObjects(Item.self))之后使用filter

标签: ios swift realm uisearchcontroller rx-swift


【解决方案1】:

最简单的方法是:

func bindTableView() {
    let dataSource = RxTableViewRealmDataSource<Item>(cellIdentifier: "itemCell", cellType: UITableViewCell.self) { cell, ip, item in
        cell.textLabel?.text = item.uuid
    }
    search.asObservable()
        .map { text in DataStore.sharedInstance.getObjects(Item.self).filter("someProperty == %@", text) }
        .flatMap { results in Observable.changeset(from: results) }
        .bind(to: tableView.rx.realmChanges(dataSource))
        .addDisposableTo(bag)
}

【讨论】:

  • 不幸的是,它没有按预期工作 - 结果以正确的方式过滤,但表格显示不正确。如果我打印结果,一切似乎都很好,但看起来.bind(to: tableView.rx.realmChanges(dataSource)) 不起作用。知道我可能做错了什么吗?我正在使用您提供的剪辑。提前致谢,
【解决方案2】:

https://stackoverflow.com/a/46364131/7694178 中的问题可能与多个绑定有关。试试这个:

let changeset = Observable.changeset(from: DataStore.sharedInstance.getObjects(Item.self))
Observable.combineLatest(changeset, search.asObservable()) { changeset, string in
        return (changeset.0.filter("someProperty == %@", string), changeset.1)
    }
    .bind(to: tableView.rx.realmChanges(dataSource))
    .disposed(by: bag)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-04
    相关资源
    最近更新 更多