此文章主要總結(jié)一下Moya+RxSwift網(wǎng)絡(luò)請求中一些常見的情況。如有不足歡迎來訪交流。話不多說直接上干貨。
1.開始前的準備工作
- 導(dǎo)入用到的第三方庫
pod 'RxSwift'
pod 'RxCocoa'
pod 'Alamofire'
pod 'Moya/RxSwift'
pod 'SwiftyJSON'
pod 'ObjectMapper'
- 配置ObjectMapper的通用類
請參照我的另一篇文章Swift ObjectMapper 通用類配置
至此所有的前置準備工作完成
2.創(chuàng)建網(wǎng)絡(luò)請求的公共類(我創(chuàng)建好的公共請求類的文件放在后面)
1.先創(chuàng)建一個公共類的文件 我的文件名是BaseTool,
此處存放了一些網(wǎng)絡(luò)請求用的到的公共類 如url地址 header請求頭等信息
class BaseTool { //
static var disposeBag = DisposeBag()
//URL地址
static var baseUrl : URL{
get{
return URL(string: "https://xxxxxxx")
}
}
//header
static var headers: [String: String] {
get {
xxxxxxx 此處自定義添加你的header信息
return headers
}
}
}
2.擴展一下BaseTool 存放網(wǎng)絡(luò)請求的公共類
extension BaseTool{
// 最最核心的地方
static func request<T : TargetType>(target: T) -> Single<Any>{
//此處可以自定義一個檢測網(wǎng)絡(luò)狀態(tài)的東西
let provider = MoyaProvider<T>()
return Single<Any>.create {signal -> Disposable in
//網(wǎng)絡(luò)請求模塊
provider.rx.request(target).asObservable().subscribe { (event) in
switch event{
case let .next(response)://網(wǎng)絡(luò)請求成功
let responseDic = JSON(response.data).dictionaryObject
//此處的返回信息依據(jù)自己的情況去定義 例如添加上400錯
signal(.success(response.data))//
case let .error(error)://網(wǎng)絡(luò)請求失敗
signal(.error(error))
case .completed: break//完成
}
}.disposed(by: BaseTool.disposeBag)
return Disposables.create()
}
}
}
BaseTool完整的代碼
import Foundation
import Moya
import RxSwift
import SwiftyJSON
import SwiftyUserDefaults
import ObjectMapper
class BaseTool {
static var disposeBag = DisposeBag()
static var netWorkStatus = Reachability.Connection.unavailable
//URL地址
static var baseUrl : URL{
get{
return URL(string: "https://xxxxxxxxxxx")!
}
}
//header
static var headers: [String: String] {
get {
var headers = [String : String]()
return headers
}
}
}
extension BaseTool{
static func request<T : TargetType>(target: T) -> Single<Any>{
//檢測網(wǎng)絡(luò)狀態(tài)
let netWorkStatus = BaseTool.checkNetWorkStatus()
if !netWorkStatus {
return Single<Any>.create{signal -> Disposable in
signal(.success(NOTNETWORKSTRING))
return Disposables.create()
}
}
let provider = MoyaProvider<T>()
return Single<Any>.create {signal -> Disposable in
//網(wǎng)絡(luò)請求模塊
provider.rx.request(target).asObservable().subscribe { (event) in
switch event{
case let .next(response)://網(wǎng)絡(luò)請求成功
let responseDic = JSON(response.data).dictionaryObject
signal(.success(response.data))//數(shù)據(jù)轉(zhuǎn)化為字典然后返回
case let .error(error)://網(wǎng)絡(luò)請求失敗
signal(.error(error))
case .completed: break//完成
}
}.disposed(by: BaseTool.disposeBag)
return Disposables.create()
}
}
}
extension BaseTool{
//MARK:檢測網(wǎng)絡(luò)狀態(tài)
static func checkNetWorkStatus() -> Bool{
do{
let reach = try Reachability.init(hostname: "https://www.baidu.com")
BaseTool.netWorkStatus = reach.connection
}catch{}
if netWorkStatus == .unavailable{
return false
}
return true
}
}
3.配置一個網(wǎng)絡(luò)請求的類 繼承自TargetType
import UIKit
import Moya
enum CommenTool {
case systemArea//獲取集團架構(gòu)
}
extension CommenTool : TargetType{
var baseURL: URL {
return BaseTool.baseUrl //返回URL url已經(jīng)保存在了BaseTool里面了
}
var path: String {
switch self {
case .systemArea:
return "system/area"
//返回地址鏈接 地址鏈接公共類已經(jīng)卸載了BaseTool里面 這里是非公共的部分
}
}
var method: Moya.Method {
switch self {
case .systemArea:
return .get//get還是post請求
}
}
var sampleData: Data {
return "".data(using: String.Encoding.utf8)!//文件格式
}
var task: Task {
switch self {
case .systemArea:
return .requestParameters(parameters: ["":""], encoding: URLEncoding.default)
}
}
var headers: [String : String]? {
return BaseTool.headers
}
}
此處畫重點- 單網(wǎng)絡(luò)請求和多網(wǎng)絡(luò)請求的使用方法
4.單網(wǎng)絡(luò)請求的使用方法
BaseTool.request(target: CommenTool.systemArea).subscribe{event in
switch event{
case let .success(response):
guard response is Bool else {
let responseDic = JSON(response).dictionaryValue
let requestArray = responseDic["data"]?.arrayValue.map({ json -> SystemAreaModel in
return SystemAreaModel(JSON: json.dictionaryObject!)!
})
OrderSystemAreaArray = requestArray!
break
}
case .error(_):break//請求失敗返回false
}
}.disposed(by: disposeBag)
5.多網(wǎng)絡(luò)共同請求
使用RxSwift的.zip參數(shù)實現(xiàn)多網(wǎng)絡(luò)請求
Observable.zip(BaseTool.request(target: OrderTool.orderDetail(id: self.orderId)).asObservable(), BaseTool.request(target: OrderTool.orderDetailEvaluate(id: self.orderId)).asObservable(), BaseTool.request(target: OrderTool.orderDetailStatus(id: self.orderId)).asObservable()).subscribe(onNext:{[weak self](detailResult , evaluateResult , statusResult) in
// 這里我用了三個網(wǎng)絡(luò)請求 detailResult , evaluateResult , statusResult
//分別對用每個網(wǎng)絡(luò)請求的返回結(jié)果
}).disposed(by: disposeBag)
6.最后一單 model的設(shè)計
import UIKit
import ObjectMapper
//MARK: 工單列表model
class OrderListModel: Mappable {
var id : Int = 0
//此處設(shè)置了參數(shù)
//而func mapping(map: Map) 方法中沒有設(shè)置的話
//則數(shù)據(jù)不會保存進來 需要自己手動保存
func mapping(map: Map) {
id <- map["id"]
}
init() {}
required init?(map: Map) {}
}
完