美文网首页
RxSwift官方实例十(刷新)

RxSwift官方实例十(刷新)

作者: 酒茶白开水 | 来源:发表于2020-12-17 09:55 被阅读0次

    代码下载

    搭建UI

    新建控制器,搭建两个UITableView和一个UICollectionView作为控制器属性:

        @IBOutlet weak var partialTableView: UITableView!
        @IBOutlet weak var tableView: UITableView!
        @IBOutlet weak var partialCollectionView: UICollectionView!
    

    在控制器的viewDidLoad函数中为导航栏的右侧设置一个item

            // 构建UI
            let rightItem = UIBarButtonItem(title: "更新", style: .plain, target: nil, action: nil)
            self.navigationItem.rightBarButtonItem = rightItem
    

    数据生成

    定义一个数据类型作为本示例的数据类型NumberSection

    typealias NumberSection = SectionModel<Int, Int>
    

    定义一个数据混乱器Randomizer,作用就是将[NumberSection]这样的数据打散、打乱。sections属性存储结果数据,randomize函数混乱数据。具体实现查看代码……

    定义一个UpdatesViewModel

    struct UpdatesViewModel {
        private var generator = Randomizer(sections: [NumberSection]())
        let sections: Driver<[NumberSection]>
        
        init(update: RxCocoa.ControlEvent<()>) {
            // 构建初始数据
            var sectionsData = [NumberSection]()
            for i in 0 ..< 10 {
                sectionsData.append(NumberSection(model: i + 1, items: Array(i ..< i + 100)))
            }
            let generator = Randomizer(sections: sectionsData)
            self.generator = generator
            
            sections = update.map { () -> [NumberSection] in
                generator.randomize()
                return generator.sections
            }.asDriver(onErrorJustReturn: sectionsData)
            .startWith(sectionsData)
        }
    }
    
    • 属性generator用来更新数据,sections就是最终的数据序列
    • 初始化函数中,接收一个更新数据指令的参数update,通过map操作符转换为需要的数据,再使用asDriverstartWith操作符来避免错误以及设置初始元素

    绑定数据

    回到控制器定义两个懒加载属性tableViewDataSourcecollectionViewDataSource来辅助绑定UITableView和UICollectionView:

        lazy var tableViewDataSource = {
            TableViewSectionedDataSource<NumberSection>(cellForRow: { (ds, tv, ip) -> UITableViewCell in
                let cell = CommonCell.cellFor(tableView: tv)
                cell.textLabel?.text = "\(ds[ip])"
                return cell
            }, titleForHeader: { (ds, tv, i) -> String? in
                return "第\(ds[i].model)组"
            })
        }()
        lazy var collectionViewDataSource = {
            CollectionViewSectionedDataSource<NumberSection>(cellForItem: { [weak self] (ds, cv, ip) -> UICollectionViewCell in
                let cell = TextCollectionViewCell.cellFor(collectionView: cv, indexPath: ip, identifier: self!.cellID)
                cell.textLabel.text = "\(ds[ip])"
                return cell
            }, viewForSupplementaryElement: { [weak self] (ds, cv, kind, ip) -> UICollectionReusableView in
                let view = TextCollectionReusableView.viewFor(collectionView: cv, indexPath: ip, kind: kind, identifier: self!.reusableViewID)
                view.textLabel.text = "第\(ds[ip.section].model)组"
                return view
            })
        }()
    

    在控制器的viewDidLoad函数中将数据绑定到前面搭建的UI元素上,方式都与之前的一样,在此不做分析:

            // 绑定
            let viewModel = UpdatesViewModel(update: rightItem.rx.tap)
            viewModel.sections
                .drive(partialTableView.rx.items(dataSource: tableViewDataSource))
                .disposed(by: bag)
            viewModel.sections
                .drive(tableView.rx.items(dataSource: tableViewDataSource))
                .disposed(by: bag)
            Observable.of(tableView.rx.modelSelected(Int.self), partialTableView.rx.modelSelected(Int.self))
                .merge()
                .subscribe(onNext: {print("我是\($0)") })
                .disposed(by: bag)
            
            viewModel.sections
                .drive(partialCollectionView.rx.items(dataSource: collectionViewDataSource))
                .disposed(by: bag)
            partialCollectionView.rx
                .modelSelected(Int.self)
                .subscribe(onNext: { print("我是\($0)") })
                .disposed(by: bag)
    

    相关文章

      网友评论

          本文标题:RxSwift官方实例十(刷新)

          本文链接:https://www.haomeiwen.com/subject/tfwagktx.html