//
|
// YYRefreshViewModel.swift
|
// OKProject
|
//
|
// Created by alvin_y on 2020/5/28.
|
// Copyright © 2020 yangwang. All rights reserved.
|
//
|
|
import Foundation
|
import RxSwift
|
import RxCocoa
|
|
enum RefreshStatus {
|
case refreshing
|
case completedRefresh
|
case refreshingError(_ error: Error)
|
case loading
|
case completedLoad
|
case completedLoadWithNoMoreData
|
case loadingError(_ error: Error)
|
}
|
|
enum RefreshType {
|
case refresh
|
case load
|
}
|
|
extension UITableView
|
{
|
func beginRefreshing() {
|
if self.mj_header != nil{
|
self.mj_header?.beginRefreshing()
|
}
|
}
|
}
|
|
|
class YYRefreshViewModel<T>: YYViewModel {
|
|
lazy var refreshSubject = PublishSubject<RefreshStatus>()
|
lazy var dataSource = BehaviorRelay<[T]>(value: [])
|
lazy var currentPage = 0
|
lazy var totalPages = 20
|
|
|
func api() -> API! {
|
|
return nil
|
}
|
|
func configure(tableView: UITableView) {
|
tableView.mj_header = YYRefreshHeader.refreshing(with: refreshDataBlock())
|
tableView.mj_footer = YYRefreshFooter.refreshing(with: loadDataBlock())
|
|
refreshSubject
|
.bind(to: tableView.rx.handlestatus())
|
.disposed(by: disposeBag)
|
}
|
|
func configure(collectionView: UICollectionView) {
|
collectionView.mj_header = YYRefreshHeader.refreshing(with: refreshDataBlock())
|
collectionView.mj_footer = YYRefreshFooter.refreshing(with: loadDataBlock())
|
|
refreshSubject
|
.bind(to: collectionView.rx.handlestatus())
|
.disposed(by: disposeBag)
|
}
|
|
|
|
func request(type: RefreshType) {
|
|
guard api() != nil else {
|
fatalError("请求类型为空,请重写 api() -> API! 方法返回一个请求类型")
|
}
|
|
switch type {
|
case .refresh:
|
currentPage = 1
|
refreshSubject.onNext(.refreshing)
|
case .load:
|
currentPage += 1
|
refreshSubject.onNext(.loading)
|
|
}
|
|
APIManager.shared.provider.rx
|
.request(api())
|
.map(YYModel<[T]>.self)
|
.validate()
|
.subscribe(onSuccess: { [unowned self] (model) in
|
|
switch type {
|
case .refresh:
|
self.dataSource.accept(model.data ?? [])
|
self.refreshSubject.onNext(.completedRefresh)
|
if (model.data?.count ?? 0) < self.totalPages {
|
self.refreshSubject.onNext(.completedLoadWithNoMoreData)
|
} else {
|
self.refreshSubject.onNext(.completedLoad)
|
}
|
|
case .load:
|
self.dataSource.accept(self.dataSource.value + (model.data ?? []))
|
if (model.data?.count ?? 0) < self.totalPages {
|
self.refreshSubject.onNext(.completedLoadWithNoMoreData)
|
} else {
|
self.refreshSubject.onNext(.completedLoad)
|
}
|
}
|
}) { [unowned self] (error) in
|
|
self.currentPage -= 1
|
|
switch type {
|
case .refresh:
|
self.refreshSubject.onNext(.refreshingError(error))
|
|
case .load:
|
self.refreshSubject.onNext(.loadingError(error))
|
}
|
}
|
.disposed(by: disposeBag)
|
}
|
|
func refreshData() {
|
|
request(type: .refresh)
|
}
|
|
func refreshDataBlock() -> (() -> Void) {
|
|
return {
|
self.request(type: .refresh)
|
}
|
}
|
|
func loadData() {
|
|
request(type: .load)
|
}
|
|
func loadDataBlock() -> (() -> Void) {
|
|
return {
|
self.request(type: .load)
|
}
|
}
|
}
|