RxSwift使用备忘 RxSwift 常用方法使用,这里记录一下。
RxSwfit实现搜索 distinctUntilChanged的作用是,相邻的重复事件不产生新的事件,所以搜索中使用distinctUntilChanged可以保证只有每次触发的搜索都是不同的字符串,也可以保证输入停止后只会触发一次搜索。
throttle 和 debounce 的区别:
throttle 每隔固定时间调用
debounce 事件停止后隔多少秒调用
所以,如果需要实现输入中搜索,使用 throttle
1 2 3 4 5 6 7 8 9 10 11 fileprivate func configureSearch () { searchBar.rx.text .orEmpty .throttle(1.0 , scheduler: MainScheduler .instance) .distinctUntilChanged() .subscribe { [unowned self ] (query) in }.disposed(by: disposeBag) }
而如果实现输入停止后搜索,使用 debounce
1 2 3 4 5 6 7 8 9 10 11 fileprivate func configureSearch () { searchBar.rx.text .orEmpty .distinctUntilChanged() .debounce(0.5 , scheduler: MainScheduler .instance) .subscribe { [unowned self ] (query) in }.disposed(by: disposeBag) }
RxSwift 实现点击 1 2 3 4 5 6 7 button.rx.tap .subscribe(onNext: { print ("button Tapped" ) }) .disposed(by: disposeBag)
RxSwift 实现代理 1 2 3 4 5 6 7 8 9 10 11 override func viewDidLoad () { super .viewDidLoad() scrollView.rx.contentOffset .subscribe(onNext: { contentOffset in print ("contentOffset: \(contentOffset) " ) }) .disposed(by: disposeBag) }
tableView 代理 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 fileprivate func setupVM () { vm.dataList .bind(to: tableView.rx.items(cellIdentifier: Cell .CellIdentifier , cellType: Cell .self )) { _ , model, cell in cell.model = model } .disposed(by: disposeBag) Observable .zip(tableView.rx.itemSelected, tableView.rx.modelSelected(CellModel .self )) .subscribe(onNext: { [weak self ] indexPath, item in self ? .handleSelectItem(at: indexPath, model: item) }) .disposed(by: disposeBag) vm.pageNum .subscribe(onNext: { [weak self ] pageNum in self ? .loadData(pageNum) }) .disposed(by: disposeBag) vm.isLastPage .subscribe(onNext: { [weak self ] isLastPage in self ? .tableView.mj_header? .endRefreshing() if isLastPage { self ? .tableView.mj_footer? .endRefreshingWithNoMoreData() } else { self ? .tableView.mj_footer? .endRefreshing() } }) .disposed(by: disposeBag) }
RxSwift 实现通知 1 2 3 4 5 6 7 8 9 10 11 12 override func viewDidLoad () { super .viewDidLoad() NotificationCenter .default.rx .notification(.UIApplicationWillEnterForeground ) .subscribe(onNext: { (notification) in print ("Application Will Enter Foreground" ) }) .disposed(by: disposeBag) }
RxSwift整合网络请求 flatMapLatest,处理多个任务有依赖关系的情况,避免回调地狱
1 2 3 4 5 6 7 8 9 10 11 API .token(username: "beeth0ven" , password: "987654321" ) .flatMapLatest(API .userInfo) .subscribe(onNext: { userInfo in print ("获取用户信息成功: \(userInfo) " ) }, onError: { error in print ("获取用户信息失败: \(error) " ) }) .disposed(by: disposeBag)
zip,同时发送多个请求,多个请求都完成后,再往下处理,就可以通过zip来实现
combineLatest,同时发生多个请求,每个请求完成后,都会触发处理事件的方法
参考: