使用 RxSwift 使用变量 id 过滤领域结果

Filter realm results with variable id using RxSwift

我想在 Rxswift 中使用 Variable 让 caseResults 使用不同的 boxId 搜索不同的结果,比如 boxId == 1 得到结果和 boxId == 2 得到另一个结果

class MainViewModel {

    let cases: Driver<[CaseItemViewModel]>
    let index = Variable<Int>(1)

    init() {
        let caseResults = realm.objects(RMCase.self)
                            .filter("boxId == \(index.value)")
                            .sorted(byKeyPath: "id", ascending: true)


        self.cases = Observable.collection(from: caseResults)
            .asDriverOnErrorJustComplete()
            .map { results in results.map { CaseItemViewModel(with: [=10=]) }}
    }
}


class CaseItemViewModel {
    let cased: RMCase
    let id: Int
    let boxId: Int
    let name: String

    init(with cased: RMCase) {
        self.cased = cased
        self.id = cased.id
        self.boxId = cased.boxId
        self.name = cased.name
    }
}

在ViewController

    viewModel.boxs
        .drive(tableView.rx.items(cellIdentifier: CellId.main.rawValue, cellType: MainTableViewCell.self)) { [weak self] row, item, cell in
            guard let strongSelf = self else { return }

            cell.setup(with: item)

            // drive collectionView into tableViewCell
            if let collectionView = cell.collectionView {

                strongSelf.viewModel.cases.asObservable()
                    .bind(to:collectionView.rx.items(cellIdentifier: "testcell", cellType: MainCollectionViewCell.self)) { _row, _item, _cell in

                     _cell.setup(with: _item)
                    }
                    .disposed(by: cell.disposeBag)
            }

            }.disposed(by: disposeBag)

首先,Variable已弃用,请改用BehaviorRelayBehaviorSubject

cases 更改为 BehaviorRelay 这样您就不必在 init 中对其进行初始化,然后观察 index 属性 并且每次更改时,像这样将新结果绑定到 cases

let cases = BehaviorRelay<[CaseItemViewModel]>(value: [])
let index = BehaviorRelay<Int>(value: 1)

init() {
  index
    .flatMap { index -> Observable<Results<RMCase>> in
      let caseResult = realm.objects(RMCase.self)
                            .filter("boxId == \(index)")
                            .sorted(byKeyPath: "id", ascending: true)

      return Observable.collection(from: caseResult)
    }
    .map { results in results.map { CaseItemViewModel(with: [=10=]) }}
    .bind(to: cases)
    .disposed(by: disposeBag)
}

cases 中,您现在始终拥有 CaseItemViewModel 的数组,并且每次 index 更改时都会填充新值。