日韩性视频-久久久蜜桃-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封装和使用教程的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: av网站在线观看免费 | 国产113页 | 少妇黄色片 | 高清一区二区在线 | 久久久欧美 | 乳罩脱了喂男人吃奶视频 | 亚洲日b视频 | 在线免费观看 | 国产91精品ai换脸 | 亚洲不卡视频在线观看 | 国产日韩一区二区 | 免费国产黄色片 | 欧美激情精品久久久久 | 日韩精品在线观看AV | 久久久久国产精品午夜一区 | 欧美xxxx性xxxxx高清 | 欧美精品久久久久久久 | 字幕网在线| 香蕉视频91 | 漂亮人妻洗澡被公强 日日躁 | 日韩a毛片 | 国产女厕一区二区三区在线视 | 一区二区三区波多野结衣 | 91夜色视频 | 亚洲五月激情 | 午夜蜜桃视频 | 欧美黄色片网站 | 亚洲免费一级片 | 欧美一区二区三区啪啪 | 69视频在线观看免费 | 在线成人av | 免费久久精品 | 亚洲综合站 | 中国女人一级片 | 毛片视频观看 | 蜜桃91丨九色丨蝌蚪91桃色 | 免费福利视频网站 | 懂色av中文字幕 | 国产黄色在线免费观看 | 在线观看av一区 | 欧美成人精品一区二区三区 | 女av在线| 色偷偷免费 | 国产黄色影院 | 98精品国产 | 国产日韩欧美一区二区东京热 | 中文一区视频 | 久久久精品免费看 | 精品理论片 | 久久欧洲| 神马香蕉久久 | 4虎tv| 老头吃奶性行交 | 蜜臀网在线| 国产精品不卡一区二区三区 | 国产永久免费无遮挡 | www成人免费视频 | 黑人玩弄人妻一区二区三区四 | 亚洲成人午夜影院 | 337p亚洲精品色噜噜噜 | 九九久久网 | 婷婷六月网 | 久久久久噜噜噜亚洲熟女综合 | 麻豆视频在线观看免费 | 高清免费毛片 | 人妻换人妻a片爽麻豆 | 亚洲24p| 久久国产黄色片 | 国产乱人伦精品一区二区 | 放荡闺蜜高h季红豆h | 红桃视频成人 | 亚洲国产成人在线 | 欧美亚韩一区二区三区 | 窝窝午夜理论片影院 | 中文字幕mv | 黄色一级小说 | 人妻少妇无码精品视频区 | 内射干少妇亚洲69xxx | 日韩羞羞 | 黄色大片在线看 | 快色av | 亚洲国产aⅴ成人精品无吗 日韩乱论 | 91综合国产| 狠狠干天天爱 | 欧美精品免费在线观看 | 国产成人精品网 | 老司机午夜剧场 | 国产精选一区二区三区 | 日韩精品一区二区三区四区 | 九七人人爽 | 91一区二区在线观看 | 无码av免费毛片一区二区 | 香蕉视频911 | 国产精品理论在线观看 | 136fldh导航福利微拍 | 久久牛牛| 蜜臀99久久精品久久久久小说 | 欧美性一区二区三区 | 美日韩精品视频 |