代码之家  ›  专栏  ›  技术社区  ›  廖豪豪

使用RxSwift筛选具有变量id的领域结果

  •  0
  • 廖豪豪  · 技术社区  · 7 年前

    我想使用 Variable 在Rxswift中,使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: $0) }}
        }
    }
    
    
    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)
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   kiwisip    7 年前

    首先 Variable 已弃用,请使用 BehaviorRelay BehaviorSubject 相反

    改变 cases 行为继电器 所以你不必在 init 然后观察 index 属性,并在每次更改时将新结果绑定到 案例 像这样:

    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: $0) }}
        .bind(to: cases)
        .disposed(by: disposeBag)
    }
    

    在里面 案例 您现在始终拥有 CaseItemViewModel 每次都会充满新的价值观 指数 更改。