使用 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
已弃用,请改用BehaviorRelay
或BehaviorSubject
。
将 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
更改时都会填充新值。
我想在 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
已弃用,请改用BehaviorRelay
或BehaviorSubject
。
将 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
更改时都会填充新值。