| | |
| | | associatedtype T:HandyJSON |
| | | func api()->(Observable<BaseResponse<[T]>>)? |
| | | } |
| | | protocol RefreshModelInnerProctol { |
| | | associatedtype T:HandyJSON |
| | | func api()->(Observable<BaseResponse<BaseResponseList<T>>>)? |
| | | } |
| | | |
| | | |
| | | class RefreshModel<T:HandyJSON>:RefreshModelProctol{ |
| | | func api() -> (RxSwift.Observable<BaseResponse<[T]>>)? { |
| | | return nil |
| | | } |
| | | |
| | | func api() -> (RxSwift.Observable<BaseResponse<[T]>>)? {return nil} |
| | | let disposeBag = DisposeBag() |
| | | |
| | | |
| | | enum RefreshType { |
| | | case refresh,load |
| | | } |
| | | |
| | | enum RefreshType {case refresh,load} |
| | | |
| | | private var handle:UIScrollView! |
| | | |
| | |
| | | func beginRefresh(){ |
| | | handle.mj_header?.beginRefreshing() |
| | | } |
| | | |
| | | |
| | | func refreshData() ->(()->Void) { |
| | | return {self.request(status: .refresh)} |
| | |
| | | } |
| | | } |
| | | |
| | | |
| | | class RefreshInnerModel<T:HandyJSON>:RefreshModelInnerProctol{ |
| | | func api() -> (RxSwift.Observable<BaseResponse<BaseResponseList<T>>>)? { |
| | | return nil |
| | | } |
| | | |
| | | let disposeBag = DisposeBag() |
| | | enum RefreshType {case refresh,load} |
| | | |
| | | private var handle:UIScrollView! |
| | | |
| | | lazy var refreshSubject = PublishSubject<RefreshState>() |
| | | var page:Int = 0 |
| | | var pageSize:Int = 20 |
| | | private var needRefreshData:Bool = true |
| | | lazy var dataSource = BehaviorRelay<BaseResponseList<T>?>(value: nil) |
| | | |
| | | func configure(_ scrollView:UITableView,needMore:Bool = true){ |
| | | scrollView.mj_header = CustomRefreshHeaer.refreshing(with: refreshData()) |
| | | if needMore{ |
| | | scrollView.mj_footer = CustomRefreshFooter.refreshing(with: loadMoreData()) |
| | | } |
| | | refreshSubject.bind(to: scrollView.rx.handlestatus()).disposed(by: disposeBag) |
| | | handle = scrollView |
| | | } |
| | | |
| | | func configure(_ scrollView:UICollectionView,needMore:Bool = true,needRefreshData:Bool = true){ |
| | | self.needRefreshData = needRefreshData |
| | | scrollView.mj_header = CustomRefreshHeaer.refreshing(with: refreshData()) |
| | | if needMore{ |
| | | scrollView.mj_footer = CustomRefreshFooter.refreshing(with: loadMoreData()) |
| | | } |
| | | refreshSubject.bind(to: scrollView.rx.handlestatus()).disposed(by: disposeBag) |
| | | handle = scrollView |
| | | } |
| | | |
| | | func beginRefresh(){ |
| | | handle.mj_header?.beginRefreshing() |
| | | } |
| | | |
| | | func refreshData() ->(()->Void) { |
| | | return {self.request(status: .refresh)} |
| | | } |
| | | |
| | | func loadMoreData() ->(()->Void) { |
| | | return {self.request(status: .load)} |
| | | } |
| | | |
| | | func request(status:RefreshType){ |
| | | switch status { |
| | | case .refresh: |
| | | self.page = 1 |
| | | self.refreshSubject.onNext(.refreshing) |
| | | case .load: |
| | | self.page += 1 |
| | | self.refreshSubject.onNext(.moreLoading) |
| | | } |
| | | |
| | | api()?.subscribe(onNext: { data in |
| | | switch status{ |
| | | case .refresh: |
| | | self.dataSource.accept(data.data) |
| | | self.refreshSubject.onNext(.completedRefresh) |
| | | case .load: |
| | | var new = self.dataSource.value?.list ?? [] |
| | | new.append(contentsOf: data.data?.list ?? []) |
| | | var model = self.dataSource.value |
| | | model!.list = new |
| | | self.dataSource.accept(model) |
| | | if data.data?.list.count == 0{ |
| | | self.refreshSubject.onNext(.completedLoadWithNoMoreData) |
| | | }else{ |
| | | self.refreshSubject.onNext(.completedLoad) |
| | | } |
| | | } |
| | | }, onError: { error in |
| | | self.refreshSubject.onNext(.completedLoad) |
| | | |
| | | }).disposed(by: disposeBag) |
| | | } |
| | | |
| | | |
| | | } |
| | | |
| | | class CustomRefreshHeaer:MJRefreshNormalHeader{ |
| | | static func refreshing(with refreshingBlock: @escaping MJRefreshComponentAction) -> MJRefreshNormalHeader? { |
| | | let refreshHeader = MJRefreshNormalHeader(refreshingBlock: refreshingBlock) |