什么是Moya?
Moya是一个基于Alamofire封装的一个抽象层,让我们更加关注自己的业务处理。

同时还可以通过中间件的方式拦截和修改请求,mock数据等等。

使用Moya
来看一个简单的例子吧,在Moya中要发送一个网络请求,需要定义个枚举并实现TargetType协议中的方法。如下:
1 | //根据不同的枚举类型来配置不同的参数 |
上面参数的函数大家看名字也就知道了。
然后需要一个MoyaProvider对象,这里使用RxMoyaProvider来进行响应式编程。
1 | let UserProvider = RxMoyaProvider<User>(stubClosure: MoyaProvider.immediatelyStub) |
stubClosure: MoyaProvider.immediatelyStub表示使用本地mock数据。
然后使用生成的RxMoyaProvider对象发起请求。
1 | let disposeBag = DisposeBag() |
运行就可以在控制台打印出本地mock的json数据了。
ObjectMapper
获取了json数据后,需要把数据解析成对应的对象,这里我们使用ObjectMapper。已有Moya-ObjectMapper, 可以满足我们的需求。
安装
1 | pod 'Moya-ObjectMapper/RxSwift' |
首先定义Model:
1 | struct User : Mappable{ |
然后在请求的时候可以指定Model去解析数据:
1 | UserProvider |
固定格式
上面都是直接就返回了一个User的数组,但是实际开发中,都会返回一个固定的格式,表示状态、消息、结果,像下面这种:
1 | { |
对于这情况怎么处理呢?
首先看一下mapArray是怎么处理的把:
1 | public func mapArray<T: BaseMappable>(_ type: T.Type, context: MapContext? = nil) throws -> [T] { |
首先调用了mapJSON转成json,然后调用Mapper<T>(context: context).mapArray(JSONArray: array)转成对象数组。
我们也可以写一个类似的方法,首先定义需要解析的公共部分结构。
1 | struct Status : Mappable{ |
然后自己写一个mapResult:
1 | public extension Response { |
然后就能获取到对应的结果了,如果出错了的话,也可以获取到错误信息。
1 | .subscribe{ |
大家想一想如果result返回的是单个对象的话,应该怎么写?
总结
Moya本身提供了强大的扩展能力,可以对其进行扩展,再加上Rx和ObjectMapper,我们可以对网络请求的发送、处理以及解析通过链式调用的方法来处理,写出优雅的代码。
代码见github: