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数据 只展示了部分数据