RXSwift+MJRefresh+Realm实现tableView的刷新(分页)

  • 刷新状态(枚举)
public enum RefreshStatus: Int {
    case DropDownSuccess // 下拉成功
    case PullSuccessHasMoreData // 上拉,还有更多数据
    case PullSuccessNoMoreData // 上拉,没有更多数据
    case InvalidData // 无效的数据
}
class SchNoticeViewModel: SLViewModel {
    static let shareInstance = SchNoticeViewModel()
    
    var top = 10
    var page = 1, t = 9

    //数据获取
    func getData() {
        ALTools().rx_RequestXML(schNoticeApi.getData(page: self.page, top: self.top, uid: User.info.userID, schID: User.info.schID!, t: self.t)).subscribe(onNext: { (data) in
            //SwiftJSON
            let json = JSON(data: data)
            let realm = try! Realm()
            if self.page == 1 {
                //第一页,下拉刷新的时候需要删除本地的所有数据
                try! realm.write {
                    let objc = realm.objects(SchNoticeModel.self)
                    realm.delete(objc)
                }
            }
            
            for mjson in json.arrayValue {
                let model = SchNoticeModel()
               ....
                //json解析,realm保存
                try! realm.write {
                    realm.add(model, update: true)
                }
            }
            if self.page == 1 {
                self.refreshStatus.value = .DropDownSuccess
                return
            }
            self.refreshStatus.value = json.count < top ? .PullSuccessNoMoreData:.PullSuccessHasMoreData

        }).addDisposableTo(disposeBag)
    }
}
  • 控制器中
    • 定义dataSource: var dataSource = Variable(SchNoticeModel)
    • dataSource绑定到tableview

self.dataSource.asObservable().bind(to: self.tableView.rx.items(cellIdentifier: identifier, cellType: SchNoticeListTableViewCell.self)) { (row, model: SchNoticeModel, cell) in
cell.model = model
}.addDisposableTo(disposeBag)

* 刷新状态的绑定
```swift
SchNoticeViewModel.shareInstance.refreshStatus.asObservable().bind { (status) in
          
          let objects = self.realm.objects(SchNoticeModel.self).sorted(byKeyPath: "time", ascending: false)
          
          var array = [SchNoticeModel]()
          for model in objects {
              array.append(model)
          }
          self.dataSource.value = array
          
          switch status {
          case .DropDownSuccess:
              self.tableView.mj_header.endRefreshing()
              break
          case .PullSuccessHasMoreData:
              self.tableView.mj_footer.endRefreshing()
              break
          case .PullSuccessNoMoreData:
              self.tableView.mj_footer.endRefreshingWithNoMoreData()
              break
          default:
              break
          }
          
          }.addDisposableTo(disposeBag)
  • 使用MJRefresh刷新,这里我对controller进行了封装,使用协议来实现刷新和加载更多
func tableViewRefresh(_ tableView: UITableView) {
      //分页的页数
      SchNoticeViewModel.shareInstance.page = self.page
      //我们自己的数据接口的需求
      SchNoticeViewModel.shareInstance.t = type
      //获取数据
      SchNoticeViewModel.shareInstance.getData()

总结:

* 简单的一个使用,后续项目再优化

上一节:RXSwift的使用 ---登陆示例
下一节:RXSwift使用RXDataSource绑定tableView

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容