I have table view that contains list of books I tried to make searchBar and search by book name
this is HomeViewModel
private var homeModelSubject = PublishSubject<[Book]>()
private var filterModelSubject = PublishSubject<[Book]>()
private var isTableHidden = BehaviorRelay<Bool>(value: false)
var searchValueBehavior = BehaviorRelay<String>(value: "")
var homeModelObservable: Observable<[Book]> {
return homeModelSubject
}
var filterModelObservable: Observable<[Book]> {
return filterModelSubject
}
var isTableHiddenObservable:Observable<Bool> {
return isTableHidden.asObservable()
}
var serchValueObservable: Observable<String> {
return searchValueBehavior.asObservable()
}
init() {
serchValueObservable.subscribe(onNext: { value in
self.homeModelObservable.map({ $0.filter ({
if value.isEmpty {return true}
return ($0.name.lowercased().contains(value.lowercased()))
})
}).bind(to: self.filterModelSubject).disposed(by: self.disposeBag)
}).disposed(by: disposeBag)
}
this function to make bind to text value
func bindToSearchValue() {
searchController.searchBar.rx.text.orEmpty.throttle(.milliseconds(500), scheduler: MainScheduler.instance).distinctUntilChanged()
.bind(to: homeViewModel.searchValueBehavior).disposed(by: disposeBage)
}
this function to subscribe to response
func subscribeToResponse() {
homeViewModel.filterModelObservable.bind(to: self.tableView.rx.items(cellIdentifier: HomeTableViewCell.reuseIdentifier, cellType: HomeTableViewCell.self)) { row,books,cell in
cell.separatorInset = UIEdgeInsets(top: 0, left: 0, bottom: 20, right: UIScreen.main.bounds.width)
cell.titleLabel.text = books.name
cell.secondaryTitleLabel.text = books.type
cell.selectionStyle = .none
if books.available == true {
cell.avalibaleOrNotLabel.text = "Avalibale"
cell.avalibaleOrNotStatus.backgroundColor = .green
} else {
cell.avalibaleOrNotLabel.text = "Not Avalibale"
cell.avalibaleOrNotStatus.backgroundColor = .gray
}
}.disposed(by: disposeBage)
}
the problem ----> when make search did not filter the cell

