|
//
// MineGroupViewController.swift
// PaiAi
//
// Created by zhengjianfei on 16/4/4.
// Copyright © 2016年 FFIB. All rights reserved.
//
import UIKit
import RxSwift
import RxCocoa
import RxDataSources
import PaiaiDataKit
import PaiaiUIKit
import PullToRefresh
final class MineGroupViewController: UIViewController {
// MARK: Storyboard property
@IBOutlet weak var tableView: UITableView!
// MARK: data property
fileprivate let disposeBag = DisposeBag()
var viewModel: MineGroupViewModel!
// MARK: view function
override func viewDidLoad() {
super.viewDidLoad()
setup()
binding()
setNavigationBar()
}
private func setNavigationBar() {
title = "我的照片群"
}
private func setup() {
setupReloadControl()
setupLoadingControl()
}
private func setupReloadControl() {
tableView.addPullToRefresh(PullToRefresh()) {
[weak self] in
guard let `self` = self else { return }
self.viewModel.reload()
}
tableView.startRefreshing(at: .top)
}
private func setupLoadingControl() {
tableView.addPullToRefresh(PullToRefresh(position: .bottom)) {
[weak self] in
guard let `self` = self else { return }
self.viewModel.preload()
}
}
}
fileprivate extension MineGroupViewController {
func observeMessage() {
viewModel.showMessage
.asDriver { _ in fatalError("Unexpected error from error messages observable.") }
.drive(onNext: { message in
Toast.show(message: message)
})
.disposed(by: disposeBag)
}
}
fileprivate extension MineGroupViewController {
var dataSource: RxTableViewSectionedAnimatedDataSource<AnimatableSectionModel<Int, GroupItem>> {
return RxTableViewSectionedAnimatedDataSource<AnimatableSectionModel<Int, GroupItem>>(configureCell: { (dataSource, tableView, indexPath, item) in
let cell = tableView.dequeueReusableCell(withIdentifier: "groupCell", for: indexPath) as! GroupCell
cell.setInfo(item)
return cell
}, canEditRowAtIndexPath: { _, _ in true })
}
func binding() {
observeMessage()
bindViewModelToTableView()
bindTableViewToViewModel()
bindViewModelToRefreshing()
}
func bindViewModelToTableView() {
viewModel.contents
.bind(to: tableView.rx.items(dataSource: dataSource))
.disposed(by: disposeBag)
}
func bindTableViewToViewModel() {
tableView.rx.itemDeleted
.asDriver()
.drive(onNext: { [unowned self] in self.viewModel.remove(of: $0.row) })
.disposed(by: disposeBag)
tableView.rx.modelSelected(GroupItem.self)
.asDriver()
.drive(onNext: { [unowned self] in self.viewModel.didSelect($0) })
.disposed(by: disposeBag)
tableView.rx.willDisplayCell
.asDriver()
.drive(onNext: { [unowned self] in self.preload(indexPath: $0.indexPath) })
.disposed(by: disposeBag)
}
func preload(indexPath: IndexPath) {
guard indexPath.row == tableView.numberOfRows(inSection: 0) - 5 else { return }
tableView.startRefreshing(at: .bottom)
}
func bindViewModelToRefreshing() {
viewModel.isLoading
.asDriver(onErrorJustReturn: true)
.drive(onNext: {[weak self] flag in
guard let `self` = self else { return }
if flag {
self.tableView.endRefreshing(at: .top)
} else {
self.tableView.endRefreshing(at: .bottom)
}
}).disposed(by: disposeBag)
viewModel.hasMoreData
.asDriver(onErrorJustReturn: true)
.drive(onNext: {[weak self] flag in
guard let `self` = self else { return }
if flag {
if self.tableView.bottomPullToRefresh == nil {
self.setupLoadingControl()
}
} else {
// self.tableViewt
}
}).disposed(by: disposeBag)
}
}
extension MineGroupViewController: NavigationBackViewController {}
|