美文网首页
RxSwift刷新TableView和Rx代理的简单使用

RxSwift刷新TableView和Rx代理的简单使用

作者: 蓝色的风 | 来源:发表于2018-03-19 11:31 被阅读699次

    前言

    在使用RxSwift框架来实现tableview的数据源和代理方法,相对于原始的代理方法更加简明和直接,很多方法和实现都是在数据绑定下进行的。

    接下来我们要做的就是刷新数据和代理方法的实现,有关于RXSwift实现TableView请参考我的另一篇文章----RXSwift --UITableView之初探

    一. 开始准备

    使用xcode 9.2
    pod引入类容如下

     pod 'RxSwift'
     pod 'RxCocoa'
     pod 'RxDataSources' #显示tableview
    

    在当前的目录中引入rx框架

    import RxCocoa
    import RxSwift
    import RxDataSources
    

    先说明一下RXSwift中的subject的几种类型和相应的区别

    RxSwift中的subject,subject是observable和Observer之间的桥梁,一个subject既是一个obserable也是一个observe,它既可以发出事件也可以监听事件
         1.publicSubject:订阅publicSubject时,只能接收到订阅他之后发生的事件,subject.onNext()发出onNext事件,对应的还有onError()和onComplete()事件
         2.replaySubject:订阅replaySubject时,可以接收到订阅他之后的事件,但也可以接受订阅他之前发出的事件,接受几个事件取决于bufferSize的大小
         3.behaviorSubject:订阅behaviorSubject,可以接收到订阅之前的最后一个事件,这个在tableView中用的比较多,一般就是初始化数据显示空值
    

    二 .下面就是定义响应的参数和实现:定义dataSource和显示的数据源

    /// 定义释放类
        let disposedBag = DisposeBag()
        
        /// SectionModel<Sting,String>中string都可以修改为你自己定义的model类或者结构体
        let dataSource = RxTableViewSectionedReloadDataSource<SectionModel<String,String>>(configureCell:{
            _, tableview,indexPath,element in
            let cell = tableview.dequeueReusableCell(withIdentifier: "systemCell", for: indexPath) as UITableViewCell
            cell.textLabel?.text = "当前显示的cell" + element
            return cell
        })
        
        /*RxSwift中的subject,subject是observable和Observer之间的桥梁,一个subject既是一个obserable也是一个observe,它既可以发出事件也可以监听事件
         1.publicSubject:订阅publicSubject时,只能接收到订阅他之后发生的事件,subject.onNext()发出onNext事件,对应的还有onError()和onComplete()事件
         2.replaySubject:订阅replaySubject时,可以接收到订阅他之后的事件,但也可以接受订阅他之前发出的事件,接受几个事件取决于bufferSize的大小
         3.BehaviorSubject:订阅behaviorSubject,可以接收到订阅之前的最后一个事件,这个在tableView中用的比较多,一般就是初始化数据显示空值
         */
        ///定义一个BehaviorSubject类型的数据源
        var dataListArr = BehaviorSubject(value: [SectionModel<String,String>]())
    

    三.开始对tableview的数据源进行初始化和数据绑定

    override func viewDidLoad() {
            super.viewDidLoad()
            myTableView.register(UITableViewCell.self, forCellReuseIdentifier: "systemCell")
            //绑定数据
            dataListArr.asObserver().bind(to: myTableView.rx.items(dataSource: dataSource)).disposed(by: disposedBag)
            //初始化显示数组
            let myOrignal = SectionModel.init(model: "first", items: ["张歆艺","张美琪","张雅芝","李佳琪"])
            dataListArr.onNext([myOrignal])
        }
    

    开始编译程序,一个简单的tableview就可以实现了


    简单tableview的实现

    四.修改数据源和添加新的数据到列表中

    tableview是最常用的控件之一,动态的显示数据是一个项目的刚需,添加刷新数据和加载数据的方法。

    • 1.刷新数据
      这个很简单直接重新定初始化一下数据可以
    @IBAction func changeMyDataSource(_ sender: Any) {
            //初始化显示数组
            let myOrignal = SectionModel.init(model: "first", items: ["郭佳佳","李梅梅","赵德刚","王雅琪"])
            dataListArr.onNext([myOrignal])
        }
    
    • 2.加载更多数据
    @IBAction func loadMoreData(_ sender: Any) {
            //取出模型数据
            var tempArr = try! dataListArr.value()
            //模型数据添加新数据
            tempArr[0].items.append(contentsOf: ["郭佳佳","李梅梅","赵德刚","王雅琪"])
            dataListArr.onNext(tempArr)
            
        }
    

    编译运行,显示如下


    数据刷新和加载更多

    五.代理数据的实现

    代理的实现使用publicSubject去实现,新建文件secondViewController,定义一个publicSubject参数,定义好按钮的点击事件

    let clickDelegate = PublishSubject<Int>()
    @IBAction func buttonClickAction(_ sender: UIButton) {
             //先返回上一层 在发送事件  这个顺序随便修改
            self.navigationController?.popViewController(animated: true)
            clickDelegate.onNext(sender.tag)
        }
    
    点击使用代理的视图如下: 代理视图

    一个简单的代理就实现了

    六.结束语

    rxSwift功能强大,要研究的还有很多,再接再厉😁😁😁😁😁😁,最后附上代码地址 testDemo

    相关文章

      网友评论

          本文标题:RxSwift刷新TableView和Rx代理的简单使用

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