(廿二)RxSwift之感受MVVM

262 阅读1分钟

举一个简单的列表来感受一下RXSwiftMVVM使用的简洁性。

下面是一个VC的代码量。

tableView 赋值绑定

import UIKit

class MMVVMViewController: MBaseViewController {
    
    let viewModel = MRXViewModel()
    var disposeBag = DisposeBag()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        view.addSubview(tableView)
        tableView.snp.makeConstraints { (make) in
            make.edges.equalToSuperview()
        }
        
        //一般赋值绑定
        let dataOB = BehaviorSubject.init(value: self.viewModel.dataArray)
        
                dataOB.asObserver().bind(to: self.tableView.rx.items(cellIdentifier: MMVVMTableViewCell.cellReuseIdentifier(), cellType: MMVVMTableViewCell.self)){
            (row,model,cell) in
            cell.setUIData(model as! MRXModel)
        }.disposed(by: self.disposeBag)
    }

    lazy var tableView: UITableView = {
        let tableView = UITableView.init(frame: view.bounds, style: .plain)
        tableView.estimatedRowHeight = 60
        tableView.register(MMVVMTableViewCell.self, forCellReuseIdentifier: MMVVMTableViewCell.cellReuseIdentifier())
        return tableView
    }()
}

tableView点击事件

tableView.rx.itemSelected.subscribe(onNext: { [weak self](indexPath) in
    print("\(String(describing: self))点击\(indexPath)行")
}).disposed(by: self.disposeBag)

tableView复选点击事件

tableView.rx.itemDeselected.subscribe(onNext: { (indexPath) in
    print("再次点击\(indexPath)行")
}).disposed(by: self.disposeBag)

tableView移动事件

tableView.isEditing = true
tableView.rx.itemMoved.subscribe(onNext: { [weak self] (sourceIndex,destinationIndex) in
    print("从\(sourceIndex)移动到\(destinationIndex)")
    self?.viewModel.dataArray.swapAt(sourceIndex.row, destinationIndex.row)
    self?.loadUI(obSubject: dataOB)
}).disposed(by: self.disposeBag)
func loadUI(obSubject:BehaviorSubject<[Any]>) {
    obSubject.onNext(self.viewModel.dataArray)
}

tableView删除事件

tableView.delegate = self
extension MMVVMViewController: UITableViewDelegate {
    func tableView(_ tableView: UITableView, editingStyleForRowAt indexPath: IndexPath) -> UITableViewCell.EditingStyle {
        return UITableViewCell.EditingStyle.delete
    }
}
tableView.rx.itemDeleted.subscribe(onNext: { [weak self](indexPath) in
    print("点击删除\(indexPath)行")
    self?.viewModel.dataArray.remove(at: indexPath.row)
    self?.loadUI(obSubject: dataOB)
}).disposed(by: self.disposeBag)

tableView新增事件

tableView.delegate = self
extension MMVVMViewController: UITableViewDelegate {
    func tableView(_ tableView: UITableView, editingStyleForRowAt indexPath: IndexPath) -> UITableViewCell.EditingStyle {
        return UITableViewCell.EditingStyle.insert
    }
}
tableView.rx.itemInserted.subscribe(onNext: { [weak self](indexPath) in
    print("添加数据在\(indexPath)行")
    guard let model = self?.viewModel.dataArray.last else{
        print("数据有问题,无法新增")
        return
    }
    self?.viewModel.dataArray.insert(model, at: indexPath.row)
    self?.loadUI(obSubject: dataOB)
}).disposed(by: self.disposeBag)