RxNetworks響應(yīng)式插件網(wǎng)絡(luò)架構(gòu)
RxNetworks 是基于 RxSwift + Moya 搭建的響應(yīng)式數(shù)據(jù)綁定網(wǎng)絡(luò) API 架構(gòu)。
MoyaNetwork
該模塊是基于Moya封裝的網(wǎng)絡(luò)API架構(gòu)
- 主要分為3部分:
- NetworkConfig:在程序最開始處設(shè)置配置信息,全局通用
- baseURL:根路徑地址
- baseParameters:默認(rèn)基本參數(shù),類似:userID,token等
- baseMethod:默認(rèn)請(qǐng)求類型
- updateBaseParametersWithValue:更新默認(rèn)基本參數(shù)數(shù)據(jù)
- RxMoyaProvider:對(duì)網(wǎng)絡(luò)請(qǐng)求添加響應(yīng)式,返回
Single序列 - NetworkUtil:網(wǎng)絡(luò)相關(guān)函數(shù)
- defaultPlugin:添加默認(rèn)插件
- transformAPISingleJSON:轉(zhuǎn)換
Single序列對(duì)象 - handyConfigurationPlugin:處理配置插件
- PluginSubType:繼承替換Moya插件協(xié)議,方便后序擴(kuò)展
- configuration:設(shè)置網(wǎng)絡(luò)配置信息之后,開始準(zhǔn)備請(qǐng)求之前,該方法可以用于密鑰失效重新去獲取密鑰然后自動(dòng)再次網(wǎng)絡(luò)請(qǐng)求等場(chǎng)景
- autoAgainRequest:自動(dòng)再次開啟上次失敗的網(wǎng)絡(luò)請(qǐng)求,該方法可以用于密鑰失效重新去獲取密鑰然后自動(dòng)再次網(wǎng)絡(luò)請(qǐng)求等場(chǎng)景
- NetworkAPI:在
TargetType基礎(chǔ)上增加協(xié)議屬性和封裝基礎(chǔ)網(wǎng)絡(luò)請(qǐng)求- ip:根路徑地址
- parameters:請(qǐng)求參數(shù)
- plugins:插件
- stubBehavior:是否走測(cè)試數(shù)據(jù)
- request:網(wǎng)絡(luò)請(qǐng)求方法
- NetworkAPIOO:面向?qū)ο筠D(zhuǎn)換器,面向協(xié)議模式轉(zhuǎn)面向?qū)ο螅奖懔?xí)慣OC思維的小伙伴
- cdy_ip:根路徑地址
- cdy_path:請(qǐng)求路徑
- cdy_parameters:請(qǐng)求參數(shù)
- cdy_plugins:插件
- cdy_testJSON:測(cè)試數(shù)據(jù)
- cdy_testTime:測(cè)試數(shù)據(jù)返回時(shí)間,默認(rèn)半秒
- cdy_HTTPRequest:網(wǎng)絡(luò)請(qǐng)求方法
- NetworkDebugging:調(diào)試打印模式
- openDebugRequest:開啟請(qǐng)求打印
- openDebugResponse:開啟結(jié)果打印
- NetworkConfig:在程序最開始處設(shè)置配置信息,全局通用
- 面向?qū)ο笫褂檬纠?:
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>()
/// 配置加載動(dòng)畫插件
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) // 結(jié)果在主線程返回
.delay(.seconds(1), scheduler: MainScheduler.instance) // 延時(shí)1秒返回
.asDriver(onErrorJustReturn: []) // 錯(cuò)誤時(shí)刻返回空
}
}
MoyaPlugins
該模塊主要就是基于moya封裝網(wǎng)絡(luò)相關(guān)插件
- 目前已封裝4款插件供您使用:
?? - 簡(jiǎn)單使用,在API協(xié)議當(dāng)中實(shí)現(xiàn)該協(xié)議方法,然后將插件加入其中即可:
var plugins: APIPlugins {
let cache = NetworkCachePlugin(cacheType: .networkElseCache)
let loading = NetworkLoadingPlugin.init(delayHideHUD: 0.5)
return [loading, cache]
}
HandyJSON
該模塊是基于HandyJSON封裝網(wǎng)絡(luò)數(shù)據(jù)解析
- 大致分為以下3個(gè)部分:
- HandyDataModel:網(wǎng)絡(luò)外層數(shù)據(jù)模型
- HandyJSONError:解析錯(cuò)誤相關(guān)
- RxHandyJSON:HandyJSON數(shù)據(jù)解析,目前提供兩種解析方案
- 方案1 - 結(jié)合
HandyDataModel模型使用解析出data數(shù)據(jù) - 方案2 - 根據(jù)
keyPath解析出指定key的數(shù)據(jù),前提條件數(shù)據(jù)源必須字典形式
- 方案1 - 結(jié)合
?? - 結(jié)合網(wǎng)絡(luò)部分使用示例:
func request(_ count: Int) -> Driver<[CacheModel]> {
CacheAPI.cache(count).request()
.asObservable()
.mapHandyJSON(HandyDataModel<[CacheModel]>.self)
.compactMap { $0.data }
.observe(on: MainScheduler.instance) // 結(jié)果在主線程返回
.delay(.seconds(1), scheduler: MainScheduler.instance) // 延時(shí)1秒返回
.asDriver(onErrorJustReturn: []) // 錯(cuò)誤時(shí)刻返回空
}
CocoaPods Install
Ex: 導(dǎo)入網(wǎng)絡(luò)架構(gòu)API
- pod 'RxNetworks/MoyaNetwork'
Ex: 導(dǎo)入數(shù)據(jù)解析
- pod 'RxNetworks/HandyJSON'
Ex: 導(dǎo)入加載動(dòng)畫插件
- pod 'RxNetworks/MoyaPlugins/Loading'
評(píng)論
圖片
表情
