什么是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: