版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- CCAA - 2023年01月建筑施工領(lǐng)域?qū)I(yè)答案及解析 - 詳解版(65題)
- 營銷業(yè)務(wù)市場調(diào)查報(bào)告作業(yè)模板
- 2026年上海市松江區(qū)中考一模物理試題(含答案)
- 養(yǎng)老院志愿者服務(wù)管理制度
- 養(yǎng)老院環(huán)境保護(hù)管理制度
- 企業(yè)項(xiàng)目管理制度
- 統(tǒng)編版(2024)七年級上冊歷史期末復(fù)習(xí):材料分析題解題方法+50題練習(xí)題(含答案解析)
- 建立健全現(xiàn)代企業(yè)制度提升管理水平
- 2025年福建省人資集團(tuán)漳州地區(qū)招聘考試真題
- 手持小型動(dòng)力工具制作工操作管理能力考核試卷含答案
- 中藥學(xué)教材課件
- 夢雖遙追則能達(dá)愿雖艱持則可圓模板
- 能源與動(dòng)力工程測試技術(shù) 課件 第一章 緒論確定
- 配件售后管理制度規(guī)范
- 浙江省紹興市上虞區(qū)2024-2025學(xué)年七年級上學(xué)期期末語文試題(解析版)
- 《隸書千字文》-清席夔
- 2024校長在寒假期末教職工大會(huì)上精彩發(fā)言主要引用3個(gè)關(guān)鍵詞善待自己改變自己提升自己
- 《鐵路技術(shù)管理規(guī)程》(普速鐵路部分)
- 2024-2025年度“地球小博士”全國地理科普知識大賽參考試題庫(含答案)
- 北師大版六年級上冊分?jǐn)?shù)混合運(yùn)算100題帶答案
- 2024年度工程成本控制優(yōu)化合同
評論
0/150
提交評論