日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

swift moya框架+rxswift+handyjson+SwiftyJSON封装和使用教程

發布時間:2023/12/14 javascript 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 swift moya框架+rxswift+handyjson+SwiftyJSON封装和使用教程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • target的作用
  • 插件plugin的基本使用添加token
  • 封裝了一個可以判斷token和加載帶轉菊花的plugin
  • Provider的作用和封裝
  • 發送請求調用request方法

moya是把alamofire再封裝的一個swift 網絡請求框架.
他和原生的alamofire和 AFNetworking 的區別是.他多了一個 Target和一個plugin

target的作用

一個target可以放多個接口,并且每個接口都可以單獨指定url和請求類型,和參數類型.利用的枚舉類型
下面代碼展示target的用法.先定義一個 enum類型,然后遵守moya的 TargetType協議.

  • baseURL是接口前面的服務器地址,一般都是返回一個.也可以通過不同的case枚舉成員,設置不同的服務器地址
  • path是每個接口的子地址
  • method返回.post 和 .get 等接口請求類型,可以根據不同的枚舉成員返回不同的方法
  • sampleData的解釋是用于測試,暫時用不上
  • task 用于可以設置發送的請求,和請求類型,例如可以設置http請求和json請求,并且可以把參數列表放進去
  • header是請求頭,但是我下面例子注釋掉了,統一返回空的請求頭,因為我把請求頭,放在了Plugin插件協議里面.在這個協議里面可以更好的設置header
  • 下面例子,我在一個叫做JiaZhang的target枚舉對象里面添加了3個接口.我在一個viewModel中,設置了3個接口.login,circle,logout
import UIKit import Moya import SwiftyJSON import RxSwift import RxCocoa import HandyJSON public enum JiaZhang :TargetType{case login([String:String]) //登錄case circle([String:String]) //朋友圈case logout([String:String]) //退出public var baseURL: URL {URL(string: "https://kindergarten.wozhijiao.cn:5057//kindergartenapi/")!}public var path: String {switch self{case .login:return "security/oauth/token"case .circle:return "circle/circle/queryCircle"case .logout:return "base/user/logout"default:return ""}}public var method: Moya.Method {return .post}public var sampleData: Data {switch self{case .login(let param):return "登錄參數是:\(param)".data(using: .utf8)!default:return "沒有對應類型".data(using: .utf8)!}}/*requestParameters設置請求參數,和請求返回的編碼格式URLEncoding.default 相當于 AFNetworking的let manager = AFHTTPSessionManager()manager.requestSerializer = AFHTTPRequestSerializer()JSONEncoding.default相當于 AFNetworking的manager.requestSerializer = AFJSONRequestSerializer()*/public var task: Task {switch self{case .login(let params):return .requestParameters(parameters: params, encoding: URLEncoding.default)//encoding代表接收的請求用什么編碼case .circle(let params):return .requestParameters(parameters: params, encoding: JSONEncoding.default)case .logout(let params):return .requestParameters(parameters: params, encoding: JSONEncoding.default)default:return .requestPlain}}public var headers: [String : String]? {switch self{case .login:return nil/*case .circle:let token = UserDefaults.standard.object(forKey: "token") as? String ?? ""header["Authorization"] = "Bearer " + tokenprint("header=",header)return headercase .logout:let token = UserDefaults.standard.object(forKey: "token") as? String ?? ""header["Authorization"] = "Bearer " + tokenprint("header=",header)return header*/default:return nil}}// 通過statuscode過濾返回內容public var validationType: ValidationType {switch self {case .login:return .successCodesdefault:return .none}} }

插件plugin的基本使用添加token

PluginType,這個協議,也是我們要自己寫一個子類繼承自PluginType.里面有一個prepare方法是每次發送請求之前執行的.在這里可以添加token,注意要新建一個臨時變量 var request = request,要不然不能更改里面的值

import UIKit import Moya import SwiftyJSON final class TdwMoyaPlugin: PluginType {public func prepare(_ request: URLRequest, target: TargetType) -> URLRequest {var request = requestrequest.addValue("token值", forHTTPHeaderField: "token名字")return request} }

封裝了一個可以判斷token和加載帶轉菊花的plugin

import UIKit import Moya import SwiftyJSON public protocol TdwMoyaToken{var existToken:Bool {get} } final class TdwMoyaPlugin: PluginType {//當前的視圖控制器var vc:UIViewControllervar existToken = true//活動狀態指示器(菊花進度條)private var spinner: UIActivityIndicatorView!//插件初始化的時候傳入當前的視圖控制器init(vc:UIViewController) {self.vc = vcspinner = UIActivityIndicatorView(style: .gray)//轉菊花spinner.center = self.vc.view.center}var tokenVal:String {get {guard let myInfo = O2UserDefaults.shared.myInfo else { //加載自己的tokenreturn ""}return myInfo.token ?? ""}}var clientVal:String {get {let version = ProcessInfo.processInfo.operatingSystemVersionlet versionString = "\(version.majorVersion).\(version.minorVersion).\(version.patchVersion)"return "iOS \(versionString)"}}public func prepare(_ request: URLRequest, target: TargetType) -> URLRequest {var request = request//加上通用頭request.addValue(clientVal, forHTTPHeaderField: "x-client")if let authorizable = target as? TdwMoyaToken,authorizable.existToken == false {return request}print("clientVal=",clientVal)//加上tokenlet tokenName = O2AuthSDK.shared.tokenName()request.addValue(tokenVal, forHTTPHeaderField: tokenName)print("tokenVal=",tokenVal)print("tokenName=",tokenName)return request}//開始發起請求func willSend(_ request: RequestType, target: TargetType) {//請求時在界面中央顯示一個活動狀態指示器DispatchQueue.main.async {[weak self] inself?.vc.view.addSubview(self!.spinner)self?.spinner.startAnimating()}}//收到請求func didReceive(_ result: Result<Moya.Response, MoyaError>, target: TargetType) {//移除界面中央的活動狀態指示器DispatchQueue.main.async {[weak self] inself?.spinner.removeFromSuperview()self?.spinner.stopAnimating()}//只有請求錯誤時會繼續往下執行guard case let Result.failure(error) = result else { return }//彈出并顯示錯誤信息let message = error.errorDescription ?? "未知錯誤"let alertViewController = UIAlertController(title: "請求失敗",message: "\(message)",preferredStyle: .alert)alertViewController.addAction(UIAlertAction(title: "確定", style: .default,handler: nil))vc.present(alertViewController, animated: true)} }

Provider的作用和封裝

  • 調用插件plugin
  • 發送請求request
    provider是用來發送請求的,里面有request方法.我們使用的時候自己定義一個provider.繼承自框架的MoyaProvider.
    之所以繼承的好處是,讓provider可以指定自己的plugin插件,例如我下面的
import UIKit import Moya import RxSwift import RxCocoa import SwiftyJSON class TdwMoyaProvider<Target>: MoyaProvider<Target> where Target:TargetType{open var plugin:TdwMoyaPlugin!let disposeBag = DisposeBag()init(vc:UIViewController,existToken:Bool){self.plugin = TdwMoyaPlugin(vc: vc)//調用自己的pluginsuper.init( plugins: [self.plugin])}func requestTdw(target:Target,success: @escaping (_ JSON: JSON) -> Void, fail: @escaping (_ error:Error) -> Void){self.rx.request(target).subscribe { event in//rxswift使用moya發送請求print("event=",event)switch event {case .success(let response):let data = response.datalet json = JSON(data)success(json)case .error(let error):print(error)fail(error)}}.disposed(by: disposeBag)} }

發送請求調用request方法

var provider = TdwMoyaProvider(vc: self, existToken: true) provider.request(JiaZhang.login(param)) { json inprint("json=",json) }

總結

以上是生活随笔為你收集整理的swift moya框架+rxswift+handyjson+SwiftyJSON封装和使用教程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。