From 54c6ef0be42d9f2e49a344fd69f231cb6df43797 Mon Sep 17 00:00:00 2001 From: 无故事王国 <841720330@qq.com> Date: 星期一, 04 三月 2024 20:10:43 +0800 Subject: [PATCH] fix --- WanPai/ViewModel/RefreshModel.swift | 402 ++++++++++++++++++++++++++++++++++----------------------- 1 files changed, 241 insertions(+), 161 deletions(-) diff --git a/WanPai/ViewModel/RefreshModel.swift b/WanPai/ViewModel/RefreshModel.swift index d253fff..40264f1 100644 --- a/WanPai/ViewModel/RefreshModel.swift +++ b/WanPai/ViewModel/RefreshModel.swift @@ -1,9 +1,9 @@ - // - // RefreshModel.swift - // WanPai - // - // Created by 无故事王国 on 2023/7/11. - // +// +// RefreshModel.swift +// WanPai +// +// Created by 无故事王国 on 2023/7/11. +// import UIKit import MJRefresh @@ -13,187 +13,267 @@ enum RefreshState { - case refreshing - case completedRefresh - case moreLoading - case completedLoad - case completedLoadWithNoMoreData + case refreshing + case completedRefresh + case moreLoading + case completedLoad + case completedLoadWithNoMoreData } protocol RefreshModelProctol { - associatedtype T:HandyJSON - func api()->(Observable<BaseResponse<[T]>>)? + 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} - let disposeBag = DisposeBag() + 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<[T]>(value: []) + + 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 + if let datas = data.data{ + switch status{ + case .refresh: + self.dataSource.accept(datas) + self.refreshSubject.onNext(.completedRefresh) + case .load: + self.dataSource.accept(self.dataSource.value + datas) + if datas.count == 0{ + self.refreshSubject.onNext(.completedLoadWithNoMoreData) + }else{ + self.refreshSubject.onNext(.completedLoad) + } + } + }else{ + self.refreshSubject.onNext(.completedLoadWithNoMoreData) + } + }, onError: { error in + self.refreshSubject.onNext(.completedLoad) + + }).disposed(by: disposeBag) + } +} - enum RefreshType { - case refresh,load - } +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) + } - 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<[T]>(value: []) - - 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 - if let datas = data.data{ - switch status{ - case .refresh: - self.dataSource.accept(datas) - self.refreshSubject.onNext(.completedRefresh) - case .load: - self.dataSource.accept(self.dataSource.value + datas) - if datas.count == 0{ - self.refreshSubject.onNext(.completedLoadWithNoMoreData) - }else{ - self.refreshSubject.onNext(.completedLoad) - } - } - }else{ - self.refreshSubject.onNext(.completedLoadWithNoMoreData) - } - }, 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) - return refreshHeader - } + static func refreshing(with refreshingBlock: @escaping MJRefreshComponentAction) -> MJRefreshNormalHeader? { + let refreshHeader = MJRefreshNormalHeader(refreshingBlock: refreshingBlock) + return refreshHeader + } } class CustomRefreshFooter:MJRefreshAutoNormalFooter{ - static func refreshing(with refreshingBlock: @escaping MJRefreshComponentAction) -> MJRefreshAutoNormalFooter? { - let refrehFooter = MJRefreshAutoNormalFooter(refreshingBlock: refreshingBlock) - refrehFooter.isRefreshingTitleHidden = true - refrehFooter.stateLabel?.isHidden = true - return refrehFooter - } + static func refreshing(with refreshingBlock: @escaping MJRefreshComponentAction) -> MJRefreshAutoNormalFooter? { + let refrehFooter = MJRefreshAutoNormalFooter(refreshingBlock: refreshingBlock) + refrehFooter.isRefreshingTitleHidden = true + refrehFooter.stateLabel?.isHidden = true + return refrehFooter + } } extension Reactive where Base : UITableView { - func handlestatus() -> Binder<RefreshState> { - return Binder(self.base) { (tableView, status) in - switch status { - case .moreLoading: - self.base.mj_footer?.beginRefreshing() - case .refreshing: - self.base.reloadData() - self.base.mj_footer?.resetNoMoreData() - self.base.mj_header?.beginRefreshing() + func handlestatus() -> Binder<RefreshState> { + return Binder(self.base) { (tableView, status) in + switch status { + case .moreLoading: + self.base.mj_footer?.beginRefreshing() + case .refreshing: + self.base.reloadData() + self.base.mj_footer?.resetNoMoreData() + self.base.mj_header?.beginRefreshing() - case .completedLoadWithNoMoreData: - DispatchQueue.main.async { - self.base.reloadData() - } - (self.base.mj_footer as? MJRefreshAutoNormalFooter)?.stateLabel?.isHidden = false - self.base.mj_footer?.endRefreshingWithNoMoreData() - self.base.mj_header?.endRefreshing() - case .completedLoad: - DispatchQueue.main.async { - self.base.reloadData() - } - self.base.mj_footer?.endRefreshing() - self.base.mj_header?.endRefreshing() - default: - DispatchQueue.main.async { - self.base.reloadData() - } - self.base.mj_header?.endRefreshing() - self.base.mj_footer?.endRefreshing() - } - } - } + case .completedLoadWithNoMoreData: + DispatchQueue.main.async { + self.base.reloadData() + } + (self.base.mj_footer as? MJRefreshAutoNormalFooter)?.stateLabel?.isHidden = false + self.base.mj_footer?.endRefreshingWithNoMoreData() + self.base.mj_header?.endRefreshing() + case .completedLoad: + DispatchQueue.main.async { + self.base.reloadData() + } + self.base.mj_footer?.endRefreshing() + self.base.mj_header?.endRefreshing() + default: + DispatchQueue.main.async { + self.base.reloadData() + } + self.base.mj_header?.endRefreshing() + self.base.mj_footer?.endRefreshing() + } + } + } } extension Reactive where Base : UICollectionView { - func handlestatus() -> Binder<RefreshState> { - return Binder(self.base) { (tableView, status) in - switch status { - case .moreLoading: - self.base.mj_footer?.beginRefreshing() - case .refreshing: - self.base.reloadData() - self.base.mj_footer?.resetNoMoreData() - self.base.mj_header?.endRefreshing() + func handlestatus() -> Binder<RefreshState> { + return Binder(self.base) { (tableView, status) in + switch status { + case .moreLoading: + self.base.mj_footer?.beginRefreshing() + case .refreshing: + self.base.reloadData() + self.base.mj_footer?.resetNoMoreData() + self.base.mj_header?.endRefreshing() - case .completedLoadWithNoMoreData: - DispatchQueue.main.async { - self.base.reloadData() - } - self.base.mj_footer?.endRefreshingWithNoMoreData() - case .completedLoad: - DispatchQueue.main.async { - self.base.reloadData() - } - self.base.mj_footer?.endRefreshing() - default: - DispatchQueue.main.async { - self.base.reloadData() - } - self.base.mj_header?.endRefreshing() - self.base.mj_footer?.endRefreshing() - } - } - } + case .completedLoadWithNoMoreData: + DispatchQueue.main.async { + self.base.reloadData() + } + self.base.mj_footer?.endRefreshingWithNoMoreData() + case .completedLoad: + DispatchQueue.main.async { + self.base.reloadData() + } + self.base.mj_footer?.endRefreshing() + default: + DispatchQueue.main.async { + self.base.reloadData() + } + self.base.mj_header?.endRefreshing() + self.base.mj_footer?.endRefreshing() + } + } + } } -- Gitblit v1.7.1