RXSwift+MJRefresh+Realm實現(xiàn)tableView的刷新(分頁)

  • 刷新狀態(tài)(枚舉)
public enum RefreshStatus: Int {
    case DropDownSuccess // 下拉成功
    case PullSuccessHasMoreData // 上拉,還有更多數(shù)據(jù)
    case PullSuccessNoMoreData // 上拉,沒有更多數(shù)據(jù)
    case InvalidData // 無效的數(shù)據(jù)
}
class SchNoticeViewModel: SLViewModel {
    static let shareInstance = SchNoticeViewModel()
    
    var top = 10
    var page = 1, t = 9

    //數(shù)據(jù)獲取
    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 {
                //第一頁,下拉刷新的時候需要刪除本地的所有數(shù)據(jù)
                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)

* 刷新狀態(tài)的綁定
```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進(jìn)行了封裝,使用協(xié)議來實現(xiàn)刷新和加載更多
func tableViewRefresh(_ tableView: UITableView) {
      //分頁的頁數(shù)
      SchNoticeViewModel.shareInstance.page = self.page
      //我們自己的數(shù)據(jù)接口的需求
      SchNoticeViewModel.shareInstance.t = type
      //獲取數(shù)據(jù)
      SchNoticeViewModel.shareInstance.getData()

總結(jié):

* 簡單的一個使用,后續(xù)項目再優(yōu)化

上一節(jié):RXSwift的使用 ---登陸示例
下一節(jié):RXSwift使用RXDataSource綁定tableView

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 前面介紹了RXSwift的簡單實用:登陸示例,以及和MJRefresh來實現(xiàn)刷新分頁,但是在實際開發(fā)中,這往往不夠...
    StoneWing閱讀 7,987評論 3 4
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,695評論 19 139
  • 目錄 Getting StartedGetting HelpModelsRelationshipsWritesQu...
    Jafir閱讀 8,573評論 2 4
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,670評論 4 61
  • 123456789
    私念無法歸類閱讀 216評論 0 0

友情鏈接更多精彩內(nèi)容