# RxNetworks **Repository Path**: mirrors/RxNetworks ## Basic Information - **Project Name**: RxNetworks - **Description**: RxNetworks 是基于 RxSwift + Moya 搭建的响应式数据绑定网络 API 架构 - **Primary Language**: Swift - **License**: MIT - **Default Branch**: master - **Homepage**: https://www.oschina.net/p/rxnetworks - **GVP Project**: No ## Statistics - **Stars**: 3 - **Forks**: 0 - **Created**: 2022-01-14 - **Last Updated**: 2026-02-21 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Booming [![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-brightgreen.svg?style=flat&colorA=28a745&&colorB=4E4E4E)](https://github.com/yangKJ/RxNetworks) [![CocoaPods Compatible](https://img.shields.io/cocoapods/v/Booming.svg?style=flat&label=Booming&colorA=28a745&&colorB=4E4E4E)](https://cocoapods.org/pods/Booming) [![CocoaPods Compatible](https://img.shields.io/cocoapods/v/RxNetworks.svg?style=flat&label=RxNetworks&colorA=28a745&&colorB=4E4E4E)](https://cocoapods.org/pods/RxNetworks) ![Platform](https://img.shields.io/badge/Platforms-iOS%20%7C%20macOS%20%7C%20watchOS-4E4E4E.svg?colorA=28a745) **🧚. RxSwift + Moya + HandyJSON/Codable + Plugins.👒👒👒** ------- [**English**](README.md) | 简体中文 基于 **RxSwift + Moya** 搭建响应式数据绑定网络API架构 ### 内置插件 该模块主要就是基于moya封装网络相关插件 - 目前已封装14款插件供您使用: - [Header](https://github.com/yangKJ/RxNetworks/blob/master/Plugins/Features/NetworkHttpHeaderPlugin.swift): 配置请求头插件 - [Authentication](https://github.com/yangKJ/RxNetworks/blob/master/Plugins/Features/NetworkAuthenticationPlugin.swift): 拦截器插件 - [Debugging](https://github.com/yangKJ/RxNetworks/blob/master/Plugins/Features/NetworkDebuggingPlugin.swift): 网络打印,内置插件 - [GZip](https://github.com/yangKJ/RxNetworks/blob/master/Plugins/Features/NetworkGZipPlugin.swift): 解压缩插件 - [Shared](https://github.com/yangKJ/RxNetworks/blob/master/Plugins/Features/NetworkSharedPlugin.swift): 网络共享插件 - [Files](https://github.com/yangKJ/RxNetworks/blob/master/Plugins/Features/NetworkFilesPlugin.swift): 网络下载文件和上传资源插件 - [Token](https://github.com/yangKJ/RxNetworks/blob/master/Plugins/Features/NetworkTokenPlugin.swift): Token令牌注入验证插件 - [Ignore](https://github.com/yangKJ/RxNetworks/blob/master/Plugins/Features/NetworkIgnorePlugin.swift): 忽略默认插件 - [CustomCache](https://github.com/yangKJ/RxNetworks/blob/master/Plugins/Features/NetworkCustomCachePlugin.swift): 自定义网络数据缓存插件 - [Cache](https://github.com/yangKJ/RxNetworks/blob/master/Plugins/Cache/NetworkCachePlugin.swift): 网络数据缓存插件 - [Lottie](https://github.com/yangKJ/RxNetworks/blob/master/Plugins/Lottie/AnimatedLoadingPlugin.swift): 基于lottie动画加载插件 iOS 系统: - [Loading](https://github.com/yangKJ/RxNetworks/blob/master/Plugins/Huds/NetworkLoadingPlugin.swift): 加载动画插件 - [Warning](https://github.com/yangKJ/RxNetworks/blob/master/Plugins/Huds/NetworkWarningPlugin.swift): 网络失败提示插件 - [Indicator](https://github.com/yangKJ/RxNetworks/blob/master/Plugins/Views/NetworkIndicatorPlugin.swift): 指示器插件 简单使用,在API协议当中实现该协议方法,然后将插件加入其中即可: ``` var plugins: APIPlugins { let cache = NetworkCachePlugin.init(options: .cacheThenNetwork) let loading = NetworkLoadingPlugin.init(options: .init(delay: 0.5)) let warning = NetworkWarningPlugin.init() let shared = NetworkSharedPlugin.init() let gzip = NetworkGZipPlugin.init() return [loading, cache, warning, shared, gzip] } ``` ### HandyJSON 该模块是基于`HandyJSON`封装网络数据解析 - 大致分为以下3个部分: - [HandyDataModel](https://github.com/yangKJ/RxNetworks/blob/master/Sources/HandyJSON/HandyDataModel.swift):网络外层数据模型 - [HandyJSONError](https://github.com/yangKJ/RxNetworks/blob/master/Sources/HandyJSON/HandyJSONError.swift):解析错误相关 - [RxHandyJSON](https://github.com/yangKJ/RxNetworks/blob/master/Sources/HandyJSON/RxHandyJSON.swift):HandyJSON数据解析,目前提供两种解析方案 - **方案1** - 结合`HandyDataModel`模型使用解析出`data`数据 - **方案2** - 根据`keyPath`解析出指定key的数据,前提条件数据源必须字典形式 🎷 - 结合网络部分使用示例: ``` func request(_ count: Int) -> Driver<[CacheModel]> { CacheAPI.cache(count).request() .asObservable() .mapHandyJSON(HandyDataModel<[CacheModel]>.self) .compactMap { $0.data } .observe(on: MainScheduler.instance) // 结果在主线程返回 .delay(.seconds(1), scheduler: MainScheduler.instance) // 延时1秒返回 .asDriver(onErrorJustReturn: []) // 错误时刻返回空 } ``` ### HollowCodable 这个模块是序列化和反序列化数据,取代HandyJSON。 🎷 - 结合网络部分使用示例: ``` func request(_ count: Int) -> Observable<[CodableModel]> { CodableAPI.cache(count) .request(callbackQueue: DispatchQueue(label: "request.codable")) .deserialized(ApiResponse<[CodableModel]>.self, mapping: CodableModel.self) .compactMap({ $0.data }) .observe(on: MainScheduler.instance) .catchAndReturn([]) } ``` ### 如何使用 这边提供多种多样的使用方案供您选择,怎么选择就看你心情; 🎷 - 面向对象使用示例1: ``` class OOViewModel: NSObject { let userDefaultsCache = UserDefaults(suiteName: "userDefaultsCache")! func request(block: @escaping (String) -> Void) { let api = NetworkAPIOO.init() api.ip = "https://www.httpbin.org" api.path = "/headers" api.method = APIMethod.get api.plugins = [ NetworkLoadingPlugin(options: .init(text: "OOing..")), NetworkCustomCachePlugin.init(cacheType: .cacheThenNetwork, cacher: userDefaultsCache), NetworkIgnorePlugin(pluginTypes: [NetworkActivityPlugin.self]), ] api.mapped2JSON = false api.request(successed: { response in guard let string = response.bpm.toJSONString(prettyPrint: true) else { return } block(string) }) } } ``` 🎷 - MVP使用示例2: ``` enum LoadingAPI { case test2(String) } extension LoadingAPI: NetworkAPI { var ip: APIHost { return BoomingSetup.baseURL } var path: String { return "/post" } var parameters: APIParameters? { switch self { case .test2(let string): return ["key": string] } } } class LoadingViewModel: NSObject { let disposeBag = DisposeBag() let data = PublishRelay() /// 配置加载动画插件 let APIProvider: MoyaProvider = { let configuration = URLSessionConfiguration.default configuration.headers = .default configuration.timeoutIntervalForRequest = 30 let session = Moya.Session(configuration: configuration, startRequestsImmediately: false) let loading = NetworkLoadingPlugin.init() return MoyaProvider(session: session, plugins: [loading]) }() func loadData() { APIProvider.rx.request(api: LoadingAPI.test2("666")) .asObservable() .subscribe { [weak self] (event) in if let dict = event.element as? NSDictionary { self?.data.accept(dict) } }.disposed(by: disposeBag) } } ``` 🎷 - MVVM使用示例3: ``` class CacheViewModel: NSObject { let disposeBag = DisposeBag() struct Input { let count: Int } struct Output { let items: Driver<[CacheModel]> } func transform(input: Input) -> Output { let elements = BehaviorRelay<[CacheModel]>(value: []) let output = Output(items: elements.asDriver()) request(input.count) .asObservable() .bind(to: elements) .disposed(by: disposeBag) return output } } extension CacheViewModel { func request(_ count: Int) -> Driver<[CacheModel]> { CacheAPI.cache(count).request() .asObservable() .deserialize(ApiResponse<[CacheModel]>.self) .compactMap { $0.data } .observe(on: MainScheduler.instance) // 结果在主线程返回 .delay(.seconds(1), scheduler: MainScheduler.instance) // 延时1秒返回 .asDriver(onErrorJustReturn: []) // 错误时刻返回空 } } ``` 🎷 - 链式请求使用示例4: ``` class ChainViewModel: NSObject { struct Input { } struct Output { let data: Observable } func transform(input: Input) -> Output { let data = chain().asObservable() return Output(data: data) } func chain() -> Observable { Observable.from(optional: "begin") .flatMapLatest(requestIP) .flatMapLatest(requestData(ip:)) .catchAndReturn([:]) } } extension ChainViewModel { func requestIP(_ stirng: String) -> Observable { return ChainAPI.test.request() .asObservable() .map { (($0 as? NSDictionary)?["origin"] as? String) ?? stirng } .observe(on: MainScheduler.instance) } func requestData(ip: String) -> Observable { return ChainAPI.test2(ip).request() .map { ($0 as! NSDictionary) } .catchAndReturn(["data": "nil"]) .observe(on: MainScheduler.instance) } } ``` 🎷 - 批量请求使用示例5: ``` class BatchViewModel: NSObject { struct Input { } struct Output { let data: Observable<[String: Any]> } func transform(input: Input) -> Output { let data = batch().asObservable() return Output(data: data) } func batch() -> Observable<[String: Any]> { Observable.zip( BatchAPI.test.request(), BatchAPI.test2("666").request(), BatchAPI.test3.request() ) .observe(on: MainScheduler.instance) .map { [$0, $1, $2].compactMap { $0 as? [String: Any] }} .map { $0.reduce([String: Any](), +==) } .catchAndReturn([:]) } } ``` ### CocoaPods Install ``` Ex: 导入网络架构API - pod 'Booming' Ex: 导入加载动画插件 - pod 'NetworkHudsPlugin' Ex: 导入数据解析 - pod 'RxNetworks/HandyJSON' Ex: 导入响应式模块 - pod 'RxNetworks/RxSwift' ``` ### 关于作者 - 🎷 **邮箱地址:[ykj310@126.com](ykj310@126.com) 🎷** - 🎸 **GitHub地址:[yangKJ](https://github.com/yangKJ) 🎸** - 🎺 **掘金地址:[茶底世界之下](https://juejin.cn/user/1987535102554472/posts) 🎺** - 🚴🏻 **简书地址:[77___](https://www.jianshu.com/u/c84c00476ab6) 🚴🏻** ---- 当然如果您这边觉得好用对你有所帮助,请给作者一点辛苦的打赏吧。再次感谢感谢!!! 有空我也会一直更新维护优化 😁😁😁

**救救孩子吧,谢谢各位老板。** 🥺 -----