真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

使用RxSwift怎么實現(xiàn)網(wǎng)絡(luò)請求-創(chuàng)新互聯(lián)

今天就跟大家聊聊有關(guān)使用RxSwift怎么實現(xiàn)網(wǎng)絡(luò)請求,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

成都創(chuàng)新互聯(lián)于2013年開始,先為揭西等服務(wù)建站,揭西等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為揭西企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。

1.使用RxSwift相關(guān)庫的版本

  • ObjectMapper (3.2.0)

  • HandyJSON (4.1.1)

  • Moya (11.0.2)

  • RxCocoa (4.2.0)

  • RxSwift (4.2.0)

2.在Swift語言中,我們使用Alamofire 作為網(wǎng)絡(luò)庫,moya 是對Alamofire 更抽象一層的封裝,RxSwift把Moya封裝后作為網(wǎng)絡(luò)請求的接口,我們在使用的時候只需要實現(xiàn) TargetType 協(xié)議就好,用一個例子來看下怎么使用:

import Foundation
import Moya
enum APIService{
  case mainClassList
}

extension APIService:TargetType{

  var baseURL: URL {
    return URL(string:"http://cmsadmin.fotoable.net")!
  }
  
  var path: String {
    switch self {
    case .mainClassList:
       return "/sandboxColor/category"
    }
  }
  
  var method: Moya.Method {
    switch self {
    case .mainClassList:
       return .get
    }
  }
  
  var parameters: [String : Any]? {
    
    switch self {
    case .mainClassList:
      return nil
    }
  }
  
  var parameterEncoding: ParameterEncoding {
    
    return URLEncoding.default
  }
  
  var sampleData: Data {
    return "{}".data(using: String.Encoding.utf8)!
  }
  
  var task: Task {
    return .requestPlain
  }
  
  var headers: [String : String]? {
    return nil
  }
}

首先,我們定義了一個 枚舉 APIService ,作用主要是在內(nèi)部定義網(wǎng)絡(luò)請求的接口,然后,就是對協(xié)議 TargetType進(jìn)行擴(kuò)展,我們一一解讀下里面的參數(shù)

  • baseURL:網(wǎng)絡(luò)請求的基本URL

  • path:用于匹配具體網(wǎng)絡(luò)請求接口

  • method:網(wǎng)絡(luò)請求方式,常用就是 get/post 兩種

  • parameters:接口請求時要帶的參數(shù)

  • parameterEncoding:參數(shù)編碼方式(這里使用URL的默認(rèn)方式)

  • sampleData:這里用于單元測試

  • task:執(zhí)行網(wǎng)絡(luò)請求的任務(wù)

  • validationType:是否執(zhí)行Alamofire驗證,默認(rèn)值為false

  • headers:網(wǎng)絡(luò)請求時需要的header,如果和后臺沒有特殊的驗證處理,默認(rèn)傳nil 就可以

  • APIService 作為網(wǎng)絡(luò)請求的統(tǒng)一接口,里面封裝了網(wǎng)絡(luò)請求所需的一些基本數(shù)據(jù)

3.在進(jìn)行網(wǎng)絡(luò)請求之前,需要做一些準(zhǔn)備工作,把網(wǎng)絡(luò)請求回的數(shù)據(jù)通過JSON 轉(zhuǎn)化成 Model , 這里我們使用了兩種方式進(jìn)行轉(zhuǎn)換(根據(jù)項目的情況,靈活選擇使用),一種通過 ObjectMapper庫進(jìn)行轉(zhuǎn)換,一種是通過 HandyJSON 庫 進(jìn)行轉(zhuǎn)換 ,分別通過對 Response 類 擴(kuò)展 ,以下是對這兩種方式的封裝

其一:使用 ObjectMapper庫 把JSON 轉(zhuǎn)換成 Model

import Foundation
import RxSwift
import Moya
import ObjectMapper

// MARK: - Json -> Model
extension Response {
  
  func mapObjectModel(_ type: T.Type, context: MapContext? = nil) throws -> T {
    guard let object = Mapper(context: context).map(JSONObject: try mapJSON()) else {
      throw MoyaError.jsonMapping(self)
    }
    return object
  }
  
  func mapObjectArray(_ type: T.Type, context: MapContext? = nil) throws -> [T] {
    guard let array = try mapJSON() as? [[String : Any]] else {
      throw MoyaError.jsonMapping(self)
    }
    return Mapper(context: context).mapArray(JSONArray: array)
  }
}

// MARK: - Json -> Observable

extension ObservableType where E == Response {
  // 將Json解析為Observable
  public func mapObjectModel(_ type: T.Type) -> Observable {
    return flatMap { response -> Observable in
      return Observable.just(try response.mapObjectModel(T.self))
    }
  }
  // 將Json解析為Observable<[Model]>
  public func mapObjectArray(_ type: T.Type) -> Observable<[T]> {
    return flatMap { response -> Observable<[T]> in
      return Observable.just(try response.mapObjectArray(T.self))
    }
  }
}

其二 : 使用 HandyJSON 庫 把JSON 轉(zhuǎn)化成 Model

import Foundation
import RxSwift
import Moya
import HandyJSON

extension ObservableType where E == Response {
  public func mapHandyJsonModel(_ type: T.Type) -> Observable {
    return flatMap { response -> Observable in
      return Observable.just(response.mapHandyJsonModel(T.self))
    }
  }
}

extension Response {
  func mapHandyJsonModel(_ type: T.Type) -> T {
    let jsonString = String.init(data: data, encoding: .utf8)
    if let modelT = JSONDeserializer.deserializeFrom(json: jsonString) {
      return modelT
    }
    return JSONDeserializer.deserializeFrom(json: "{\"msg\":\"請求有誤\"}")!
  }
}

4.在MainClassViewModel中,使用已經(jīng)封裝好的接口進(jìn)行網(wǎng)絡(luò)請求,代碼如下:

import RxSwift
import Moya
import ObjectMapper
import HandyJSON
import RxCocoa

class MainClassViewModel {

  private let provider = MoyaProvider()
  let disposeBag = DisposeBag()
  var dataSource = BehaviorRelay<[MainClassModelMapObject_sub]>(value:[])
  var networkError = BehaviorRelay(value: Error.self)
}


//MARK: -- 網(wǎng)絡(luò)
extension MainClassViewModel {
  
  //網(wǎng)絡(luò)請求-- ObjectMapper
  func getClassListWithMapObject(){
    provider.rx.request(.mainClassList).asObservable().mapObjectModel(MainClassModelMapObject.self).subscribe({ [unowned self] (event) in
      
      switch event {
      case let .next(classModel):
        print("ObjectMapper -- 加載網(wǎng)絡(luò)成功")
        self.dataSource.accept(classModel.data)
        
      case let .error( error):
        print("error:", error)
        self.networkError.accept(error as! Error.Protocol)
      case .completed: break
      }
    }).disposed(by: self.disposeBag)
  }
  
  
  //網(wǎng)絡(luò)請求-- HandyJSON
  func getClassListWithMapHandyJson(){
    provider.rx.request(.mainClassList).asObservable().mapHandyJsonModel(MainClassModel.self).subscribe({ [unowned self] (event) in
      
      switch event {
      case let .next(classModel):
        
        print("HandyJSON -- 加載網(wǎng)絡(luò)成功")
        
      case let .error( error):
        print("error:", error)
        self.networkError.accept(error as! Error.Protocol)
      case .completed: break
      }
    }).disposed(by: self.disposeBag)
  }
  
}

這里用了兩種方式,分別對 mainClassList API 接口進(jìn)行了網(wǎng)絡(luò)請求,唯一不同的是,在得到到網(wǎng)絡(luò)請求回來數(shù)據(jù)的時候,一個是使用 mapObjectModel 把JSON 轉(zhuǎn)化成 Model ,一個是使用 mapHandyJsonModel 把 JSON轉(zhuǎn)化成Model ,由于我們使用的是不同的庫,把JSON 轉(zhuǎn)化成 Model,這兩種實現(xiàn)的方式還是有一些差別,下面是這兩種 Model 的具體實現(xiàn)方式:

其一、實現(xiàn)協(xié)議 Mappable

import UIKit
import ObjectMapper

class MainClassModelMapObject: Mappable {
  
  var code:NSInteger?
  var data:[MainClassModelMapObject_sub]!
  
  required init?(map: Map) {}
  
  func mapping(map: Map) {
    code <- map["code"]
    data <- map["data"]
  }
}

class MainClassModelMapObject_sub: Mappable {
  
  var ID:String?
  var name:String?
  var desc:String?
  var imgUrl:String?
  var gifUrl:String?
  var isUpdate:Bool?
  var backgroundGroup:NSInteger?
  
  required init?(map: Map) {}
  
  func mapping(map: Map) {
    
    ID <- map["ID"]
    name <- map["name"]
    desc <- map["desc"]
    imgUrl <- map["imgUrl"]
    gifUrl <- map["gifUrl"]
    isUpdate <- map["isUpdate"]
    backgroundGroup <- map["backgroundGroup"]
  }
}

其二、實現(xiàn)協(xié)議 HandyJSON

import UIKit
import HandyJSON

struct MainClassModel: HandyJSON {

  var code:NSInteger?
  var data:[MainClassModel_sub]!
}

struct MainClassModel_sub: HandyJSON {
  
  var ID:String?
  var name:String?
  var desc:String?
  var imgUrl:String?
  var gifUrl:String?
  var isUpdate:Bool?
  var backgroundGroup:NSInteger?
}

5、以上是使用 RxSwift 進(jìn)行網(wǎng)絡(luò)請求的分析,接下來看一個示例如何使用,在MainClassViewModel 中我們使用 dataSource 保存了網(wǎng)絡(luò)請求回來的數(shù)據(jù),我們要在 ViewController里 用tableview 把這個數(shù)據(jù)展示出來,需要提前把數(shù)據(jù)源和TableView進(jìn)行綁定,以下是示例代碼:

 //cell
   viewModel.dataSource.bind(to: tableView.rx.items) { (tableView, row, element) in
      let cell = tableView.dequeueReusableCell(withIdentifier: "MainClassTableViewCell", for: IndexPath(row: row, section: 0)) as! MainClassTableViewCell
      
      cell.setModel(model: element)
      // configure cell
      return cell
      }
      .disposed(by: disposeBag)

看完上述內(nèi)容,你們對使用RxSwift怎么實現(xiàn)網(wǎng)絡(luò)請求有進(jìn)一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司行業(yè)資訊頻道,感謝大家的支持。

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)建站www.cdcxhl.com,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。


網(wǎng)頁標(biāo)題:使用RxSwift怎么實現(xiàn)網(wǎng)絡(luò)請求-創(chuàng)新互聯(lián)
分享URL:http://weahome.cn/article/hijch.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部