MVVM响应式基础架构送给你,要不要?

MVVM + RxSwift

?. MVVM + RxSwift + CTMediatror + MJRefresh + DZNEmptyDataSet

基于 MVVM + RxSwift 搭建响应式数据绑定基础架构

CatHome

  • 资源模块,主要处理图片资源和文本资源读取

    • 读取图片资源:R.image("base_black_back")
    • 读取文本资源:R.text("base_empty_title")
    • 读取颜色资源:R.color("background")

    WX20220323-120306@2x.png

BeeBox

  • 主要收集RxSwift相关好用方法类等

Adapter

  • 该模块主要就是封装基类

CTMediatror

  • 该模块主要解决Swift采用该组件化方案CocoaPods问题
extension CTMediator {
    /// Swift调度者
    func Second_viewController(title: String) -> (UIViewController?) {
        let params = [
            "title": title,
            kCTMediatorParamsKeySwiftTargetModuleName: "Rickenbacker_Example"
        ] as [AnyHashable : Any]
        let viewController = self.performTarget(String(describing: SecondViewController.self),
                                                action: "Extension_ViewController",
                                                params: params,
                                                shouldCacheTarget: false) as? UIViewController
        return (viewController)
    }
}

class Target_SecondViewController: NSObject {
    /// 备注提示,这里必须加上`@objc`
    /// 否则会出现找不到该方法从而导致控制器为`nil`问题
    @objc func Action_Extension_ViewController(_ params: NSDictionary) -> UIViewController? {
        guard let title = params["title"] as? String else { return nil }
        let vc = SecondViewController.init()
        vc.viewModel = SecondViewModel.init(title: title)
        return vc
    }
}
复制代码

HBDNavigationBar

MJRefresh

  • 该模块是基于MJRefresh封装列表刷新功能
final class MJRefreshViewModel: ViewModel {
    struct Input {
        let headerRefresh: Observable<Void>
        let footerRefresh: Observable<Void>
    }
    struct Output {
        let items: Driver<[String]>
    }
}

extension MJRefreshViewModel: ViewModelType {
    func transform(input: Input) -> Output {
        var objects: [String] = []
        var page: Int = 1
        
        /// 下拉刷新
        let refresh = input.headerRefresh.then(page = 1)
            .flatMapLatest {
                MJRefreshAPI.refresh(page).request()
            }.map { [unowned self] (items) -> [String] in
                refreshSubject.onNext(.endHeaderRefresh)
                objects = items
                return objects
            }.asDriver(onErrorJustReturn: [])
        
        /// 上拉加载更多
        let more = input.footerRefresh.then(page += 1)
            .flatMapLatest {
                MJRefreshAPI.refresh(page).request()
            }.map { [unowned self] (items) -> [String] in
                if items.isEmpty {
                   refreshSubject.onNext(.endFooterRefreshWithNoData)
                } else {
                    refreshSubject.onNext(.endFooterRefresh)
                }
                objects += items
                return objects
            }.asDriver(onErrorJustReturn: [])
            
        /// 数据响应    
        let items = Driver.of(refresh, more).merge()
        /// 空数据绑定
        items.map { $0.isEmpty }.asObservable().bind(to: isEmptyData).disposed(by: disposeBag)
        return Output(items: items)
    }
}
复制代码

DZNEmptyDataSet

let driver = NetworkService().randomResult().asObservable()
driver.map { $0.isEmpty }.bind(to: isEmptyData).disposed(by: disposeBag)
复制代码

CocoaPods Install

目前暂时包含如下七大模块:

  • 导入项目响应式基类模块:pod 'Rickenbacker/Adapter'
  • 导入资源模块:pod 'Rickenbacker/CatHome'
  • 导入收集模块:pod 'Rickenbacker/BeeBox'
  • 导入组件化模块:pod 'Rickenbacker/CTMediatror'
  • 导入导航栏基础模块:pod 'Rickenbacker/HBDNavigationBar'
  • 导入自动刷新模块:pod 'Rickenbacker/MJRefresh'
  • 导入空数据自动展示模块:pod 'Rickenbacker/DZNEmptyDataSet'

觉得有帮助的老哥们,请帮忙点个星 ⭐..

救救孩子吧,谢谢各位老板。

?

最后

✌️.

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享