如在OC中使用AFNetworking一般,Swift我们用Alamofire来做网络库.而Moya在Alamofire的基础上又封装了一层:
1.关于moya
官方说moya
有以下特性-_-:
- 编译时检查正确的API端点访问.
- 使你定义不同端点枚举值对应相应的用途更加明晰.
- 提高测试地位从而使单元测试更加容易.
2.开始
### 1.创建枚举API
就像这样:
1 | enum APIManager { |
### 2.实现TargetType
协议
就像这样:
1 | extension APIManager: TargetType { |
在这里,可以设置请求的参数,例如url……method……para等.
### 3.使用
Moya
的使用非常简单,通过TargetType
协议定义好每个target
之后,就可以直接使用Moya
开始发送网络请求了。就像这样:
1 | let provider = MoyaProvider<APIManager>() |
3.配合RxSwift
Moya
本身已经是一个使用起来非常方便,能够写出非常简洁优雅的代码的网络封装库,但是让Moya
变得更加强大的原因之一还因为它对于Functional Reactive Programming
的扩展,具体说就是对于RxSwift
和ReactiveCocoa
的扩展,通过与这两个库的结合,能让Moya
变得更加强大。我选择RxSwift
的原因有两个,一个是RxSwift
的库相对来说比较轻量级,语法更新相对来说比较少,我之前用过ReactiveCocoa
,一些大版本的更新需求重写很多代码,第二个更重要的原因是因为RxSwift
背后有整个ReactiveX
的支持,里面包括Java
,JS
,.Net
, Swift
,Scala
,它们内部都用了ReactiveX
的逻辑思想,这意味着你一旦学会了其中的一个,以后可以很快的上手ReactiveX
中的其他语言。
Moya
提供了非常方面的RxSwift
扩展:
1 | let provider = RxMoyaProvider<APIManager>() |
解释一下:
RxMoyaProvider
是MoyaProvider
的子类,是对RxSwift
的扩展filterSuccessfulStatusCodes()
是Moya
为RxSwift
提供的扩展方法,顾名思义,可以得到成功地网络请求,忽略其他的mapJSON()
也是Moya RxSwift
的扩展方法,可以把返回的数据解析成JSON
格式subscribe
是一个RxSwift
的方法,对经过一层一层处理的Observable
订阅一个onNext
的observer
,一旦得到JSON
格式的数据,就会经行相应的处理addDisposableTo(disposeBag)
是RxSwift
的一个自动内存处理机制,跟ARC
有点类似,会自动清理不需要的对象。
4.配合HandyJSON
在实际应用过程中网络请求往往紧密连接着数据层(Model
),具体地说,在我们的这个例子中,一般我们需要建立一个类用来统一管理数据,然后把得到的 JSON
数据映射到数据层(Model
)。
1 | struct MenuModel: HandyJSON { |
然后创建ViewModel类,创建具体请求方法:
1 | class MenuViewModel { |
这里解释一下:
我这里是将请求的数据通过闭包传了出去,当然也可以不那么做.个人喜好问题..
这里是为 RxSwift
中的 ObservableType
和 Response
写一个简单的扩展方法 mapModel
,利用我们写好的Model
类,一步就把JSON
数据映射成 model
。1
2
3
4
5
6
7
8
9
10
11
12
13
14extension ObservableType where E == Response {
public func mapModel<T: HandyJSON>(_ type: T.Type) -> Observable<T> {
return flatMap { response -> Observable<T> in
return Observable.just(response.mapModel(T.self))
}
}
}
extension Response {
func mapModel<T: HandyJSON>(_ type: T.Type) -> T {
let jsonString = String.init(data: data, encoding: .utf8)
return JSONDeserializer<T>.deserializeFrom(json: jsonString)!
}
}
5.配合ObjectMapper
毕竟将json数据转换成model的库那么多 ….,所以……,用哪个很随意…..这里再介绍一下ObjectMapper
1.创建model类
1 | class DetailModel: Mappable { |
使用 ObjectMapper
,需要让自己的 Model
类使用 Mappable
协议,这个协议包括两个方法:
1 | required init?(map: Map) {} |
在 mapping
方法中,用 <-
操作符来处理和映射你的 JSON
数据。
数据类建立好之后,我们还需要为 RxSwift
中的 Observable
写一个简单的扩展方法 mapObject
,利用我们写好的model
类,一步就把JSON
数据映射成一个个 model
。
1 | extension Observable { |
mapObject
方法处理单个对象,mapArray
方法处理对象数组。如果传进来的数据
response
是一个dictionary
,那么就利用ObjectMapper
的map
方法映射这些数据,这个方法会调用你之前在mapping
方法里面定义的逻辑。如果
response
不是一个dictionary
, 那么就抛出一个错误。在底部自定义了简单的
Error
,继承了Swift
的Error
类,在实际应用过程中可以根据需要提供自己想要的Error
。
然后运行请求方法:
1 | class DetailViewModel { |
有没有感觉很爽呢!————源码地址,共同学习!
有不对之处,,,,还望各路大神不吝指正!