RxNetworks响应式插件网络架构
RxNetworks 是基于 RxSwift + Moya 搭建的响应式数据绑定网络 API 架构。
MoyaNetwork
该模块是基于Moya封装的网络API架构
- 主要分为3部分:
- NetworkConfig:在程序最开始处设置配置信息,全局通用
- baseURL:根路径地址
- baseParameters:默认基本参数,类似:userID,token等
- baseMethod:默认请求类型
- updateBaseParametersWithValue:更新默认基本参数数据
- RxMoyaProvider:对网络请求添加响应式,返回
Single
序列 - NetworkUtil:网络相关函数
- defaultPlugin:添加默认插件
- transformAPISingleJSON:转换
Single
序列对象 - handyConfigurationPlugin:处理配置插件
- PluginSubType:继承替换Moya插件协议,方便后序扩展
- configuration:设置网络配置信息之后,开始准备请求之前,该方法可以用于密钥失效重新去获取密钥然后自动再次网络请求等场景
- autoAgainRequest:自动再次开启上次失败的网络请求,该方法可以用于密钥失效重新去获取密钥然后自动再次网络请求等场景
- NetworkAPI:在
TargetType
基础上增加协议属性和封装基础网络请求- ip:根路径地址
- parameters:请求参数
- plugins:插件
- stubBehavior:是否走测试数据
- request:网络请求方法
- NetworkAPIOO:面向对象转换器,面向协议模式转面向对象,方便习惯OC思维的小伙伴
- cdy_ip:根路径地址
- cdy_path:请求路径
- cdy_parameters:请求参数
- cdy_plugins:插件
- cdy_testJSON:测试数据
- cdy_testTime:测试数据返回时间,默认半秒
- cdy_HTTPRequest:网络请求方法
- NetworkDebugging:调试打印模式
- openDebugRequest:开启请求打印
- openDebugResponse:开启结果打印
- NetworkConfig:在程序最开始处设置配置信息,全局通用
- 面向对象使用示例1:
class OOViewModel: NSObject {
let disposeBag = DisposeBag()
let data = PublishRelay<String>()
func loadData() {
var api = NetworkAPIOO.init()
api.cdy_ip = NetworkConfig.baseURL
api.cdy_path = "/ip"
api.cdy_method = .get
api.cdy_plugins = [NetworkLoadingPlugin.init()]
api.cdy_HTTPRequest()
.asObservable()
.compactMap{ (($0 as! NSDictionary)["origin"] as? String) }
.bind(to: data)
.disposed(by: disposeBag)
}
}
🎷 - MVP使用示例2:
enum LoadingAPI {
case test2(String)
}
extension LoadingAPI: NetworkAPI {
var ip: APIHost {
return NetworkConfig.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<NSDictionary>()
/// 配置加载动画插件
let APIProvider: MoyaProvider<MultiTarget> = {
let configuration = URLSessionConfiguration.default
configuration.headers = .default
configuration.timeoutIntervalForRequest = 30
let session = Moya.Session(configuration: configuration, startRequestsImmediately: false)
let loading = NetworkLoadingPlugin.init()
return MoyaProvider<MultiTarget>(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()
.mapHandyJSON(HandyDataModel<[CacheModel]>.self)
.compactMap { $0.data }
.observe(on: MainScheduler.instance) // 结果在主线程返回
.delay(.seconds(1), scheduler: MainScheduler.instance) // 延时1秒返回
.asDriver(onErrorJustReturn: []) // 错误时刻返回空
}
}
MoyaPlugins
该模块主要就是基于moya封装网络相关插件
🏠 - 简单使用,在API协议当中实现该协议方法,然后将插件加入其中即可:
var plugins: APIPlugins {
let cache = NetworkCachePlugin(cacheType: .networkElseCache)
let loading = NetworkLoadingPlugin.init(delayHideHUD: 0.5)
return [loading, cache]
}
HandyJSON
该模块是基于HandyJSON
封装网络数据解析
- 大致分为以下3个部分:
- HandyDataModel:网络外层数据模型
- HandyJSONError:解析错误相关
- RxHandyJSON:HandyJSON数据解析,目前提供两种解析方案
- 方案1 - 结合
HandyDataModel
模型使用解析出data
数据 - 方案2 - 根据
keyPath
解析出指定key的数据,前提条件数据源必须字典形式
- 方案1 - 结合
🎷 - 结合网络部分使用示例:
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: []) // 错误时刻返回空
}
CocoaPods Install
Ex: 导入网络架构API
- pod 'RxNetworks/MoyaNetwork'
Ex: 导入数据解析
- pod 'RxNetworks/HandyJSON'
Ex: 导入加载动画插件
- pod 'RxNetworks/MoyaPlugins/Loading'
评论