In order to create MVVM and RxSwift, I want to create a simple search screen that will look like a table and a search bar. When the user enters something into the search bar, I will show what he has in this table. It sounds pretty simple, but I can't find a tutorial that suits me.
I already wrote all the code in the controller, I just can’t understand what you need to observe changes to the search text, and then call the database method, which will filter the elements by the search text.
Some code that I already have.
My viewcontroller
import Foundation
import UIKit
import RxSwift
import RxCocoa
class PlaceSearchViewController: UIViewController {
@IBOutlet weak var searchBar: UISearchBar!
@IBOutlet weak var tableView: UITableView!
private var viewModel: PlaceSearchViewModel!
private let disposeBag = DisposeBag()
override func viewDidLoad() {
super.viewDidLoad()
viewModel = PlaceSearchViewModel()
addBindsToViewModel(viewModel)
}
private func addBindsToViewModel(viewModel: PlaceSearchViewModel) {
searchBar.rx_text.bindTo(viewModel.searchTextObservable)
viewModel.placesObservable.bindTo(tableView.rx_itemsWithCellFactory) {
(tableView: UITableView, index, place: Place) in
let indexPath = NSIndexPath(forItem: index, inSection: 0)
let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as PlaceCell
cell.configureWithObject(place)
return cell
}
.addDisposableTo(disposeBag)
tableView.rx_contentOffset
.subscribe { _ in
if self.searchBar.isFirstResponder() {
_ = self.searchBar.resignFirstResponder()
}
}
.addDisposableTo(disposeBag)
}
}
And my look model:
import Foundation
import RxSwift
import RxCocoa
class PlaceSearchViewModel {
private let disposeBag = DisposeBag()
private let placesObservable: Observable<[Place]>
var searchTextObservable = Variable<String>("")
init() {
placesObservable = searchTextObservable.asObservable()
.debounce(0.3, scheduler: MainScheduler.instance)
.distinctUntilChanged()
.flatMapLatest { searchString -> Observable<[Place]> in
}
.shareReplay(1)
}
}
In addition, I have a method [DataBase searchPlaces:searchText]that returns an array from places - [Place]. I cannot figure out where and how to place it in flatMapLatestmy ViewModel.