本文主要是为了最新版本的Moya使用
RxMoya简
Moya是一个基于Alamofire的Networking library,对你没看错就是对Alamofire的一个封装。而RxMoya 就是为RxSwift 提供的一个扩展。
Moya使用
下面我们来举个栗子,以请求一个妹子图功能的接口获取数据
- 接口地址 https://api.isoyu.com/index.php/api/Picture/hua_ban
第一步
首先定义一个 enum 来对我们请求的功能进行明确的分类。
enum MZTAPI {
case GetMz // 这里就是我们要实现的功能获取妹子
}
然后我们需要让这个enum遵守TargetType协议,在这个协议中可以看到 TargetType定义了我们发送一个网络请求所需要的东西。
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 {
// 这里是单元测试数据,如果不需要写单元测试这里就可以管,但是必须要实现
return "".data(using: String.Encoding.utf8)!
}
var task: Task {
// 在swfit4.0 中Moya 需要在这里为每个请求添加接口参数
switch self {
case .GetMz:
return .requestPlain // 这里代表不需要请求参数
}
}
var headers: [String : String]? {
return nil
}
}
到这里后就可以去发送一个请求了
先定义一个 Provider
let zmtProvider = MoyaProvider.init(plugins: [NetworkLoggerPlugin.init(verbose: true, responseDataFormatter: JSONResponseDataFormatter)])
在定义Provider的时候可以传入多个参数 大家有兴趣可以点进去看看
然后用这个Provider去请求数据
zmtProvider.request(.GetMz) { (result) in
switch result {
case let .success(response):
print(response)
break
case let .failure(error):
print(error)
break
}
}
到这里就搞定了Moya的请求,下一步就是把请求回来的数据转换成模型我们就可以使用了。
ObjectMapper的使用
在上面的操作中我们已经得到json数据了,想要使用还需要一步转模型。
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 然后实现 必要的 2个协议就可以了,
把JSON 转为 Model 对象:
let mztModel = MZTModel(JSONString: JSONString)
把 Model 对象转为 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用于把请求的数据序列化, .asObservable().mapArray这里就开始转模型了, 最后.subscribe这里是订阅前面的事件流序列,这里是RxSwift 中相关的用法。
文章中只贴出了部分用法,更多内容请参考Demo