[RxSwift] 10-1. RxCocoa in TableView


RxSWIFT 21日間のプログラムを学ぶ
「Rxに挑戦する新開発者」スタート🚀
RxCocoaを用いてTable Viewにデータを表示し,これまで学んだことをレビューする.
インプリメンテーション
-実装目標
今回の体現も私の趣味で、Cross Fitを例に挙げました.
もっとよく理解するために少し説明すると、
クロスバージョンでは、モーションはWODと呼ばれています.
  • 運動名:WODを表す名前.
  • カテゴリ:有名なワードにはGirl's NameまたはHeroカテゴリがあります.
  • 詳細な動作:これらはワッドで実行する必要がある動作です.
  • 重量スケールリング:rxは、ワードが提供する最高レベルの重量である.
  • 1.table viewには、動き名、カテゴリ、詳細動作、重量レベルを含むデータが表示されます.

    2.各セルにラベルを付けた後、alertでモーション名と詳細なアクションを表示します.

    -ライブラリの使用
    🛠 リポジトリ
    - rxswift
    - rxcocoa
    - snapkit
    -実装
    1.セルのオフセット
    rxを使用しない場合は,既に依頼を使用して実現している可能性がある.
    ただし、rxを使用する場合、データObserverableとTable Viewは、委任なしにバインドしてcellに配布することができる.
    この機能を実現する方法では,セルをパラメータとして渡す方法が用いられる.
        public func items<Sequence: Swift.Sequence, Cell: UITableViewCell, Source: ObservableType>
    この方法とは異なり、セルをパラメータとして渡さない方法もあります.
    この豆腐はしばらく比較してみます.
            // 클로저로 전달되는 파라미터 row, element, cell
            // 파라미터로 전달되는 cell은 RXTableViewCell.self로 타입캐스팅 되서 전달됨
            allObservable.bind(to: tableView.rx.items(cellIdentifier: RXTableViewCell.registerID, cellType: RXTableViewCell.self)) { [weak self] row, element, cell in
                // 셀 구성
                cell.setData(element)
            }
            .disposed(by: disposeBag)
    RXTableViewCellはcustomで実現されるtableviewユニットである.
  • キャビネットに渡されるパラメータ:row、element、cell
  • snapkitを用いて4つのUILabelを実現した.cell.setData(element)は、labelのテキストにそれぞれ値を記入する役割を果たす.
        func setData(_ dataEntity : CrossfitMovements) {
            categoryLabel.text = dataEntity.category.rawValue
            nameLabel.text = dataEntity.name
            movementsLabel.text = dataEntity.movements
            levelLabel.text = dataEntity.level
        }
    トピックに戻ると,rxで実装されたコードは,依頼で実装されたコードよりもずっと簡単で直感的である.
    delegateインプリメンテーションを使用する場合は、numberOfRowsInSectionおよびcellForRowAtを使用して、返されるローの数とUItableViewCellを指定する必要があります.
    ただし,rxで実現する場合,row数を返す関数を必ずしも使用する必要はない.
    2.セルの選択
    delegateを使用する場合、didSelectRowAtを使用できます.
    このような役割を果たす方法もrxに存在する.

    定義に示すように,最終的には依頼を包囲していると考えられる.itemSelectedで、セルを選択するとnextイベントが渡され、indexPathが保存されます.
    モデルのデータ値を与えるmodelSelectedの方法もある.この場合、モデルのtypeを一緒に渡す必要があります.
    また戻って、itemSelectedで、ラベルのセルの灰色の背景色を消してみましょう.
    tableView.rx.itemSelected
        .bind { [weak self] indexPath in
            self?.tableView.deselectRow(at: indexPath, animated: false)
        }
        .disposed(by: disposeBag)
  • 代表よりも直感的だと思います.
    コード通りに読むと「itemが選択された場合、選択が解除されます!」これですぐに説明できるからです.
  • delegateと比較してrxには明らかにいくつかの利点があるが,いくつかの欠点もある.
    rxが提供する方法がない場合があります.
    たとえば、セクションを分割したいのですが、RxDataSourcesライブラリを使用して実装する必要があります.
    コード全体にリンクがかかっています.
  • model
  • data
  • viewcontroller
  • TableViewCell
  • 2つ目の実現alertの部分は次の文章で整理します.
    振り返る
    rxを使用する場合、相乗効果のある部分と不要な部分がいつでも存在する可能性があります.
    これらの部分をよく理解する開発者になる必要があります.
    もちろん、私個人の見方には違いがありますが、私がなぜここでrxを書いたのか、あるいはなぜここでrxを書いていないのかについての論理を開発する必要があります.
    そして、私は論理を整理してチームメンバーに筋道立てて話せる開発者になりたいです.
    でも….筋道のある作文と話...難しすぎます.☹️