本文主要是為了最新版本的Moya使用
RxMoya簡
Moya是一個基于Alamofire的Networking library舞丛,對你沒看錯就是對Alamofire的一個封裝寂拆。而RxMoya 就是為RxSwift 提供的一個擴展虱黄。
Moya使用
下面我們來舉個栗子筹麸,以請求一個妹子圖功能的接口獲取數(shù)據(jù)
第一步
首先定義一個 enum 來對我們請求的功能進行明確的分類。
enum MZTAPI {
case GetMz // 這里就是我們要實現(xiàn)的功能獲取妹子
}
然后我們需要讓這個enum遵守TargetType協(xié)議暑始,在這個協(xié)議中可以看到 TargetType定義了我們發(fā)送一個網(wǎng)絡(luò)請求所需要的東西伴鳖。
extension MZTAPI: TargetType {
var baseURL: URL {
// 請求的根路徑
return URL.init(string: "https://api.isoyu.com/index.php")!
}
var path: String {
// 一般一個API文件中有多個請求,那么就會有多個請求路徑
// 這里就這樣寫
switch self {
case .GetMz:
return "/api/Picture/hua_ban"
}
}
var method: Method {
// 這里 同 path 一樣的道理
switch self {
case .GetMz:
return .get
}
}
var sampleData: Data {
// 這里是單元測試數(shù)據(jù)锯梁,如果不需要寫單元測試這里就可以管,但是必須要實現(xiàn)
return "".data(using: String.Encoding.utf8)!
}
var task: Task {
// 在swfit4.0 中Moya 需要在這里為每個請求添加接口參數(shù)
switch self {
case .GetMz:
return .requestPlain // 這里代表不需要請求參數(shù)
}
}
var headers: [String : String]? {
return nil
}
}
到這里后就可以去發(fā)送一個請求了
先定義一個 Provider
let zmtProvider = MoyaProvider<MZTAPI>.init(plugins: [NetworkLoggerPlugin.init(verbose: true, responseDataFormatter: JSONResponseDataFormatter)])
在定義Provider的時候可以傳入多個參數(shù) 大家有興趣可以點進去看看
然后用這個Provider去請求數(shù)據(jù)
zmtProvider.request(.GetMz) { (result) in
switch result {
case let .success(response):
print(response)
break
case let .failure(error):
print(error)
break
}
}
到這里就搞定了Moya的請求即碗,下一步就是把請求回來的數(shù)據(jù)轉(zhuǎn)換成模型我們就可以使用了。
ObjectMapper的使用
在上面的操作中我們已經(jīng)得到j(luò)son數(shù)據(jù)了陌凳,想要使用還需要一步轉(zhuǎn)模型剥懒。
import Foundation
import ObjectMapper
class MZTModel: Mappable {
var repin_count:Int?
var img:String?
var title:String?
var desc:String?
var like:Int?
required init?(map: Map) {
}
func mapping(map: Map) {
/**
"repin_count" : 33,
"img" : "http:\/\/img.hb.aicdn.com\/615e9d15b7da715ca299495204a74e1813d5eff711355d-gCijNw",
"title" : "清新如詩",
"desc" : "",
"like" : 11
*/
repin_count <- map["repin_count"]
img <- map["img"]
title <- map["title"]
desc <- map["desc"]
like <- map["like"]
}
}
ObjectMapper 和MJExtension差不 我就不詳細介紹了
模型類繼承 Mappable 然后實現(xiàn) 必要的 2個協(xié)議就可以了,
把JSON 轉(zhuǎn)為 Model 對象:
let mztModel = MZTModel(JSONString: JSONString)
把 Model 對象轉(zhuǎn)為 JSON 字符串:
let jsonsString = mztModel.toJSONString(prettyPrint: true)
RxMoya + ObjectMapper配合使用
self.provider.rx.request(.GetMz)
.mapJSON().asObservable().mapArray(type: MZTModel.self)
.subscribe(onNext: { (model) in
if event.element! {
self.modelObserable.value = model
self.refreshobserable.value = .endHeaderRefresh
}
else {
self.modelObserable.value += model
self.refreshobserable.value = .endFooterRefresh
}
}, onError: { (error) in
if event.element! {
self.refreshobserable.value = .endHeaderRefresh
}
else {
self.refreshobserable.value = .endFooterRefresh
}
}, onCompleted: nil, onDisposed: nil)
.disposed(by: self.bag)
rx.request(.GetMz)來請求接口合敦、 .mapJSON用于把請求的數(shù)據(jù)序列化, .asObservable().mapArray這里就開始轉(zhuǎn)模型了初橘, 最后.subscribe這里是訂閱前面的事件流序列,這里是RxSwift 中相關(guān)的用法。
文章中只貼出了部分用法充岛,更多內(nèi)容請參考Demo