今是昨非

今是昨非

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

RxSwift の使用

RxSwift 使用メモ#

RxSwift の一般的なメソッドの使用方法をここに記録します。

RxSwfit での検索の実装#

distinctUntilChangedの役割は、隣接する重複したイベントが新しいイベントを生成しないようにすることです。そのため、検索ではdistinctUntilChangedを使用すると、毎回トリガされる検索が異なる文字列であることが保証され、入力が停止した後には 1 回の検索のみがトリガされることも保証されます。

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("ボタンがタップされました")
    })
    .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("アプリがフォアグラウンドに入ります")
        })
        .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は、複数のリクエストを同時に送信し、すべてのリクエストが完了した後に次の処理を行うために使用できます。

combineLatestは、複数のリクエストを同時に送信し、各リクエストが完了するたびに処理イベントがトリガされます。

参考:

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。