今是昨非

今是昨非

日出江花红胜火,春来江水绿如蓝

RxSwift 使用

RxSwift 使用備忘#

RxSwift 常用方法使用,這裡記錄一下。

RxSwfit 實現搜索#

distinctUntilChanged的作用是,相鄰的重複事件不產生新的事件,所以搜索中使用distinctUntilChanged可以保證只有每次觸發的搜索都是不同的字串,也可以保證輸入停止後只會觸發一次搜索。

throttledebounce 的區別:

  • 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,同時發生多個請求,每個請求完成後,都會觸發處理事件的方法

參考:

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。