RxSwift 使用備忘#
RxSwift 常用方法使用,這裡記錄一下。
RxSwfit 實現搜索#
distinctUntilChanged
的作用是,相鄰的重複事件不產生新的事件,所以搜索中使用distinctUntilChanged
可以保證只有每次觸發的搜索都是不同的字串,也可以保證輸入停止後只會觸發一次搜索。
throttle
和 debounce
的區別:
throttle
每隔固定時間調用debounce
事件停止後隔多少秒調用
所以,如果需要實現輸入中搜索,使用 throttle
fileprivate func configureSearch() {
searchBar.rx.text
.orEmpty
.throttle(1.0, scheduler: MainScheduler.instance)
.distinctUntilChanged()
.subscribe { [unowned self] (query) in
}.disposed(by: disposeBag)
}
而如果實現輸入停止後搜索,使用 debounce
fileprivate func configureSearch() {
searchBar.rx.text
.orEmpty
.distinctUntilChanged()
.debounce(0.5, scheduler: MainScheduler.instance)
.subscribe { [unowned self] (query) in
}.disposed(by: disposeBag)
}
RxSwift 實現點擊#
button.rx.tap
.subscribe(onNext: {
print("button Tapped")
})
.disposed(by: disposeBag)
RxSwift 實現代理#
scrollView 代理#
override func viewDidLoad() {
super.viewDidLoad()
scrollView.rx.contentOffset
.subscribe(onNext: { contentOffset in
print("contentOffset: \(contentOffset)")
})
.disposed(by: disposeBag)
}
tableView 代理#
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 實現通知#
override func viewDidLoad() {
super.viewDidLoad()
NotificationCenter.default.rx
.notification(.UIApplicationWillEnterForeground)
.subscribe(onNext: { (notification) in
print("Application Will Enter Foreground")
})
.disposed(by: disposeBag)
}
RxSwift 整合網絡請求#
flatMapLatest
,處理多個任務有依賴關係的情況,避免回調地獄
/// 通過用戶名和密碼獲取用戶信息
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
,同時發生多個請求,每個請求完成後,都會觸發處理事件的方法
參考: