【移動(dòng)應(yīng)用開發(fā)技術(shù)】使用RxSwift怎么實(shí)現(xiàn)網(wǎng)絡(luò)請求_第1頁
【移動(dòng)應(yīng)用開發(fā)技術(shù)】使用RxSwift怎么實(shí)現(xiàn)網(wǎng)絡(luò)請求_第2頁
【移動(dòng)應(yīng)用開發(fā)技術(shù)】使用RxSwift怎么實(shí)現(xiàn)網(wǎng)絡(luò)請求_第3頁
【移動(dòng)應(yīng)用開發(fā)技術(shù)】使用RxSwift怎么實(shí)現(xiàn)網(wǎng)絡(luò)請求_第4頁
【移動(dòng)應(yīng)用開發(fā)技術(shù)】使用RxSwift怎么實(shí)現(xiàn)網(wǎng)絡(luò)請求_第5頁
已閱讀5頁,還剩5頁未讀 繼續(xù)免費(fèi)閱讀

付費(fèi)下載

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

【移動(dòng)應(yīng)用開發(fā)技術(shù)】使用RxSwift怎么實(shí)現(xiàn)網(wǎng)絡(luò)請求

今天就跟大家聊聊有關(guān)使用RxSwift怎么實(shí)現(xiàn)網(wǎng)絡(luò)請求,可能很多人都不太了解,為了讓大家更加了解,在下給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。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ò)請求的接口,我們在使用的時(shí)候只需要實(shí)現(xiàn)TargetType協(xié)議就好,用一個(gè)例子來看下怎么使用:import

Foundation

import

Moya

enum

APIService{

case

mainClassList

}

extension

APIService:TargetType{

var

baseURL:

URL

{

return

URL(string:"")!

}

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

}

}首先,我們定義了一個(gè)枚舉APIService,作用主要是在內(nèi)部定義網(wǎng)絡(luò)請求的接口,然后,就是對協(xié)議TargetType進(jìn)行擴(kuò)展,我們一一解讀下里面的參數(shù)baseURL:網(wǎng)絡(luò)請求的基本URLpath:用于匹配具體網(wǎng)絡(luò)請求接口method:網(wǎng)絡(luò)請求方式,常用就是get/post兩種parameters:接口請求時(shí)要帶的參數(shù)parameterEncoding:參數(shù)編碼方式(這里使用URL的默認(rèn)方式)sampleData:這里用于單元測試task:執(zhí)行網(wǎng)絡(luò)請求的任務(wù)validationType:是否執(zhí)行Alamofire驗(yàn)證,默認(rèn)值為falseheaders:網(wǎng)絡(luò)請求時(shí)需要的header,如果和后臺沒有特殊的驗(yàn)證處理,默認(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ù)項(xiàng)目的情況,靈活選擇使用),一種通過ObjectMapper庫進(jìn)行轉(zhuǎn)換,一種是通過HandyJSON庫進(jìn)行轉(zhuǎn)換,分別通過對Response類擴(kuò)展,以下是對這兩種方式的封裝其一:使用ObjectMapper庫把JSON轉(zhuǎn)換成Modelimport

Foundation

import

RxSwift

import

Moya

import

ObjectMapper

//

MARK:

-

Json

->

Model

extension

Response

{

func

mapObjectModel<T:

BaseMappable>(_

type:

T.Type,

context:

MapContext?

=

nil)

throws

->

T

{

guard

let

object

=

Mapper<T>(context:

context).map(JSONObject:

try

mapJSON())

else

{

throw

MoyaError.jsonMapping(self)

}

return

object

}

func

mapObjectArray<T:

BaseMappable>(_

type:

T.Type,

context:

MapContext?

=

nil)

throws

->

[T]

{

guard

let

array

=

try

mapJSON()

as?

[[String

:

Any]]

else

{

throw

MoyaError.jsonMapping(self)

}

return

Mapper<T>(context:

context).mapArray(JSONArray:

array)

}

}

//

MARK:

-

Json

->

Observable<Model>

extension

ObservableType

where

E

==

Response

{

//

將Json解析為Observable<Model>

public

func

mapObjectModel<T:

BaseMappable>(_

type:

T.Type)

->

Observable<T>

{

return

flatMap

{

response

->

Observable<T>

in

return

Observable.just(try

response.mapObjectModel(T.self))

}

}

//

將Json解析為Observable<[Model]>

public

func

mapObjectArray<T:

BaseMappable>(_

type:

T.Type)

->

Observable<[T]>

{

return

flatMap

{

response

->

Observable<[T]>

in

return

Observable.just(try

response.mapObjectArray(T.self))

}

}

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

Foundation

import

RxSwift

import

Moya

import

HandyJSON

extension

ObservableType

where

E

==

Response

{

public

func

mapHandyJsonModel<T:

HandyJSON>(_

type:

T.Type)

->

Observable<T>

{

return

flatMap

{

response

->

Observable<T>

in

return

Observable.just(response.mapHandyJsonModel(T.self))

}

}

}

extension

Response

{

func

mapHandyJsonModel<T:

HandyJSON>(_

type:

T.Type)

->

T

{

let

jsonString

=

String.init(data:

data,

encoding:

.utf8)

if

let

modelT

=

JSONDeserializer<T>.deserializeFrom(json:

jsonString)

{

return

modelT

}

return

JSONDeserializer<T>.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<APIService>()

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)

workError.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)

workError.accept(error

as!

Error.Protocol)

case

.completed:

break

}

}).disposed(by:

self.disposeBag)

}

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

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"]

}

}其二、實(shí)現(xiàn)協(xié)議HandyJSONimport

UIKit

import

HandyJSON

struct

MainClassModel:

HandyJSON

{

var

code:NSInteger?

var

data:[MainClassModel_sub]!

}

struct

MainClassModel_sub:

HandyJSON

{

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論