<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          RxNetworks響應(yīng)式插件網(wǎng)絡(luò)架構(gòu)

          聯(lián)合創(chuàng)作 · 2023-09-27 09:10

          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é)果打印

           - 面向?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款插件供您使用:
            • Cache:網(wǎng)絡(luò)數(shù)據(jù)緩存插件
            • Loading:加載動(dòng)畫插件
            • Indicator:指示器插件
            • Warning:網(wǎng)絡(luò)失敗提示插件

          ?? - 簡(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ù)源必須字典形式

          ?? - 結(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'

           

          瀏覽 19
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          編輯 分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          編輯 分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产做受 91电影 | 狠狠色噜噜狠狠狠7777奇米 | 欧美性爱综合网站 | 思思热思思操 | 日韩午夜在线观看 |