Moya的基本介紹
Moya是一個基於Alamofire的Networking library,並且新增了對於ReactiveCocoa和RxSwift的介面支援,大大簡化了開發過程,是Reactive Functional Programming的網路層首選。
Moya使用的注意事項
我在使用CocoaPods的時候,以為在RXSwift中使用的就是Moya,直接pod 'Moya',導致我在下邊使用出現了問題,不能夠呼叫起該用的方法。後來看官方文件,才發現,Moya是有分類的,在RXSwift中使用的時候,需要匯入的是pod 'Moya/RxSwift',使用的時候一定要注意,Gitub上有一些關鍵性的介紹,可以前往觀看Moya
Moya的基本使用
1.首先我們需要宣告一個enum,來對請求進行明確分類。
enum APIManager {
case GetHomeList // 獲取首頁列表
case GetHomeDetail(Int) // 獲取詳情頁
複製程式碼
}
在這裡需要將不同的請求分類,放到列舉中
2.我們需要讓這個enum遵守TargetType協議,在這個協議中可以看到 TargetType定義了我們傳送一個網路請求所需要的東西,baseURL,parameter,method等一些計算性屬性,我們要做的就是去實現這些東西,當然有帶預設值的我們可以不去實現。
`extension APIManager:TargetType{
var baseURL: URL {
return URL.init(string: "http://m2.qiushibaike.com/article/list")!
}
var path: String {
switch self {
case .GetHomeList:
return "/imgrank"
case .GetHomeDetail(let id):
return "4/theme/\(id)"
}
}
// 區分get和post
var method: Moya.Method {
return .get
}
//Provides stub data for use in testing
var sampleData: Data {
return "".data(using: String.Encoding.utf8)!
}
// The type of HTTP task to be performed.
var task: Task {
return .requestPlain
}
// The headers to be used in the request.
var headers: [String : String]? {
return ["Content-Type": "application/json"]
}
複製程式碼
}` 寫好上邊的我們就可以進行請求了
let provider = MoyaProvider<APIManager>()
provider.rx.request(.GetHomeList)
.filterSuccessfulStatusCodes()
.mapJSON()
.subscribe(onSuccess: { (result) in
print(result)
}) { (error) in
print(error)
}`
** 特別注意的是,過去的版本Moya中有一個MoyaProvider有一個子類RxMoyaProvider,過去都是通過它跟RXSwift合作,進行網路請求,但是後來的版本把他給取消了,通過rx來聯絡 **
複製程式碼
但是如果一開始pod 'Moya'的話,是找不到上邊的那些方法的,只能是這樣了
provider.request(.GetHomeList) { (result) in print("\(result)") }
RxMoyaProvider是MoyaProvider的子類,是對RxSwift的擴充套件 filterSuccessfulStatusCodes() 是Moya為RxSwift提供的擴充套件方法,顧名思義,可以得到成功成功地網路請求,忽略其他的
mapJSON() 也是Moya RxSwift的擴充套件方法,可以把返回的資料解析成 JSON 格式 會返回一個Observable
然後我們就可以對這個Observable進行訂閱了
然後我們就可以得到下邊的json資料 只展示了部分資料