先把demo放上来github
本文是基于一个大神的项目SwiftHub,做了一些修改,并应用到公司app中了。谈起从学习此框架到不断优化的过程,真是痛并快乐着。
使用说明
demo目前是使用的测试数据,延时两秒返回数据,模拟访问网络的情况,具体可以查看Network/Networking.swift的APIKeysBasedStubBehaviour方法,实际使用时要使用.never来关闭模拟数据。
Network/API.swift是配置接口的地方
Network/PTPreference.swift中的baseURL要替换成自己的,NetSuccessCode要根据服务器具体设置
Networking/NetApi.swift中的NetBody结构体要根据读者服务器实际返回字段修改一下
到此,差不多就能用了
有什么特点呢
- 解决了SwiftHub中缺少的上拉加载功能
- 逻辑与UI分离,所有逻辑集中在VM中
- 网络请求提示不用在开始前写一个showWaiting(),结束后写一个hideWaiting()这种繁琐的代码。
AAViewModel.swift
// 普通请求
input.addRoute.asObservable().flatMapLatest { (route) -> Observable<Event<NetBody>> in
return self.provider.routeAdd(carModelCode: route.carModelCode, carModelName: route.carModelName, routeStartCode: route.routeStartCode, routeStartName: route.routeStartName, routeEndCode: route.routeEndCode, routeEndName: route.routeEndName, routeType: RouteType.city, truckLengthCode: route.truckLengthCode, truckLengthName: route.truckLengthName).trackError(self.error).trackActivity(self.headerLoading).trackActivity(self.loading).trackToast(self.toast).materialize()
}.subscribe(onNext: { (event) in
if case .next(_) = event {
addRouteResult.onNext(true)
refreshSubject.accept(())
}
}).disposed(by: rx.disposeBag)
// 分页请求数据-下拉刷新
// 注意,下拉刷新也需要加上trackActivity(self.footerLoading),以处理没有更多数据时候的显示问题。
Observable.combineLatest(routeRelay, input.headerRefresh).flatMapLatest {[weak self] (route, _) -> Observable<Event<PageData<PGoods>>> in
guard let self = self else {return Observable.just(Event.next(PageData<PGoods>()))}
self.page = 1
return self.provider.goods(pageNo: self.page, route: self.routeRelay.value).trackError(self.error).trackActivity(self.headerLoading).trackActivity(self.footerLoading).trackActivity(self.loading).materialize()
}.subscribe(onNext: { (event) in
if case let .next(body) = event {
self.datas.accept(body)
}
}).disposed(by: rx.disposeBag)
// 上拉加载
input.footerRefresh.flatMapLatest { [weak self] () -> Observable<Event<PageData<PGoods>>> in
guard let self = self else { return Observable.just(RxSwift.Event.next(PageData<PGoods>()))}
if !self.datas.value.noMoreData {
self.page += 1
}
return self.provider.goods(pageNo: self.page, route: self.routeRelay.value).trackError(self.error).trackActivity(self.footerLoading).trackActivity(self.loading).materialize()
}.subscribe(onNext: { event in
if case let .next(result) = event {
var newRerult = result
newRerult.items = self.datas.value.items + result.items
self.datas.accept(newRerult)
}
}).disposed(by: rx.disposeBag)
若是请求成功了,想给用户提示,但是后台返回的msg字段是success,纳尼??用如下方式轻松解决
trackToast(self.toast, toast: "自定义提示:老弟,该起来自律了")
- UITableView空数据时配置简单便捷,只需要设置RxViewController中的属性就好
override func makeUI() {
super.makeUI()
tableView.register(cellWithClass: PathCell.self)
tableView.register(cellWithClass: PathSimpleCell.self)
tableView.backgroundColor = .themeBackground
tableView.mj_footer = nil
tableView.delegate = self
tableView.dataSource = self
emptyDataSetImage = UIImage(named: "empty_money")
emptyDataSetTitle = "老弟,空了啊"
}
- 所有错误提示都集中在RxViewController中,方便处理
网友评论