RxSwfit 使用

RxSwift 使用备忘

RxSwift 常用方法使用，这里记录一下。

RxSwfit 实现搜索

distinctUntilChanged的作用是，相邻的重复事件不产生新的事件，所以搜索中使用distinctUntilChanged可以保证只有每次触发的搜索都是不同的字符串，也可以保证输入停止后只会触发一次搜索。

throttle 和 debounce 的区别：

throttle 每隔固定时间调用

debounce 事件停止后隔多少秒调用

所以，如果需要实现输入中搜索，使用 throttle

Copy

fileprivate func configureSearch() {
searchBar.rx.text
.orEmpty
.throttle(1.0, scheduler: MainScheduler.instance)
.distinctUntilChanged()
.subscribe { [unowned self] (query) in

}.disposed(by: disposeBag)
}

而如果实现输入停止后搜索，使用 debounce

Copy

fileprivate func configureSearch() {
searchBar.rx.text
.orEmpty
.distinctUntilChanged()
.debounce(0.5, scheduler: MainScheduler.instance)
.subscribe { [unowned self] (query) in

}.disposed(by: disposeBag)
}

RxSwift 实现点击

Copy

button.rx.tap
.subscribe(onNext: {
print("button Tapped")
})
.disposed(by: disposeBag)

RxSwift 实现代理

scrollView 代理

Copy

override func viewDidLoad() {
super.viewDidLoad()

scrollView.rx.contentOffset
.subscribe(onNext: { contentOffset in
print("contentOffset: \(contentOffset)")
})
.disposed(by: disposeBag)
}

tableView 代理

Copy

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 实现通知

Copy

override func viewDidLoad() {
super.viewDidLoad()

NotificationCenter.default.rx
.notification(.UIApplicationWillEnterForeground)
.subscribe(onNext: { (notification) in
print("Application Will Enter Foreground")
})
.disposed(by: disposeBag)
}

RxSwift 整合网络请求

flatMapLatest，处理多个任务有依赖关系的情况，避免回调地狱

Copy

/// 通过用户名和密码获取用户信息
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，同时发生多个请求，每个请求完成后，都会触发处理事件的方法

参考:

为什么要用 RxSwift

Throttle vs Debounce in RxSwift