美文网首页swift学习专题Rxswift
基于RxSwift的MVVM基础框架

基于RxSwift的MVVM基础框架

作者: 疯狂的面条 | 来源:发表于2021-06-24 10:33 被阅读0次

    先把demo放上来github

    本文是基于一个大神的项目SwiftHub,做了一些修改,并应用到公司app中了。谈起从学习此框架到不断优化的过程,真是痛并快乐着。

    使用说明

    demo目前是使用的测试数据,延时两秒返回数据,模拟访问网络的情况,具体可以查看Network/Networking.swift的APIKeysBasedStubBehaviour方法,实际使用时要使用.never来关闭模拟数据。
    Network/API.swift是配置接口的地方
    Network/PTPreference.swift中的baseURL要替换成自己的,NetSuccessCode要根据服务器具体设置
    Networking/NetApi.swift中的NetBody结构体要根据读者服务器实际返回字段修改一下

    到此,差不多就能用了

    有什么特点呢

    1. 解决了SwiftHub中缺少的上拉加载功能
    2. 逻辑与UI分离,所有逻辑集中在VM中
    3. 网络请求提示不用在开始前写一个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: "自定义提示:老弟,该起来自律了")
    
    1. 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 = "老弟,空了啊"
        }
    
    1. 所有错误提示都集中在RxViewController中,方便处理

    相关文章

      网友评论

        本文标题:基于RxSwift的MVVM基础框架

        本文链接:https://www.haomeiwen.com/subject/xlgwyltx.html