前面介绍了RXSwift的简单实用:登陆示例,以及和MJRefresh来实现刷新分页,但是在实际开发中,这往往不够,比如我们需要绑定多个cell,比如我们需要分组section。这时候我们需要使用一个叫做RXDataSource的开源框架
根据上一节的内容,我这里还使用MJRefresh和Realm
-
这里使用RxTableViewSectionedReloadDataSource来控制cell的更新,SectionModel: string是section的标题,可以设置为空,为空的时候表示不分section(sectionnum = 1),这里model我是用的any,因为我多个cell需要的model不同
let dataSource = RxTableViewSectionedReloadDataSource<SectionModel<String, Any>>()
let dataArray = Variable([SectionModel<String, Any>]())
-
绑定tableView
self.dataSource.configureCell = { (dataSource, tableView, indexPath, model) in
//这里实现多个cell的获取,及数据设置
switch self.type {
case 5:
let cell = tableView.dequeueReusableCell(withIdentifier: ClassWorkViewController.list_identifier) as! ClassWork_List_TableViewCell
cell.model = model as! ClassWork_List_Model
return cell
case 6:
let cell = tableView.dequeueReusableCell(withIdentifier: ClassWorkViewController.class_rank_identifier) as! Class_Ranking_CellTableViewCell
let rank = model as! ClassWorkRankModel
cell.nameLabel.text = rank.classname!
cell.countLabel.text = "发布:\(rank.count)"
return cell
case 7:
let cell = tableView.dequeueReusableCell(withIdentifier: ClassWorkViewController.people_rank_identfier) as! PeopleRankTableViewCell
cell.model = model as! PeopleRankModel
return cell
default:
return UITableViewCell()
}
}
//dataArray绑定数据到datasource
self.dataArray.asObservable()
.bind(to: self.tableView.rx.items(dataSource: dataSource))
.addDisposableTo(disposeBag)
-
刷新设置
ClassWorkViewModel.shareInstance.refreshStatus.asObservable().bind { (status) in
let realm = try! Realm()
var array = [SectionModel<String, Any>]()
//数据的获取
switch self.type {
case 5:
let objects = realm.objects(ClassWork_List_Model.self).sorted(byKeyPath: "time", ascending: false)
for model in objects {
array.append(SectionModel(model: "", items: [model]))
}
break
case 6:
let objects = realm.objects(ClassWorkRankModel.self).sorted(byKeyPath: "count", ascending: false)
for model in objects {
array.append(SectionModel(model: "", items: [model]))
}
break
case 7:
let objects = realm.objects(PeopleRankModel.self).sorted(byKeyPath: "count", ascending: false)
for model in objects {
array.append(SectionModel(model: "", items: [model]))
}
break
default:
break
}
self.dataArray.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)
-
当然还可以设置tableview的delegate协议
self.tableView.rx
.setDelegate(self)
.addDisposableTo(disposeBag)
### 实现协议的方法
// MARK: - protocol UITableViewDelegate
extension ClassWorkViewController: UITableViewDelegate {
func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
// self.dataSource[section].model 及设置的section的标题,及SectionModel<String,Ang>中的string
return UIView()
}
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
return 50
}
}
...
网友评论