RxSwift
Rx
是微软出品的一个 Funtional Reactive Programming
框架,RxSwift
是它的一个 Swift 版本的实现。
RxSwift 的主要目的是能简单的处理多个异步操作的组合,和事件/数据流。
利用 RxSwift,我们可以把本来要分散写到各处的代码,通过方法链式调用来组合起来,非常的好看优雅。
举个例子,有如下操作:
点击按钮 -> 发送网络请求 -> 对返回的数据进行某种格式处理 -> 显示在一个 UILabel 上
代码如下:
1 2 3 4 5 6 7 |
sendRequestButton .rx_tap .flatMap(viewModel.loadData) .throttle(0.3, scheduler: MainScheduler.instance) .map { "\($0.debugDescription)" } .bindTo(self.resultLabel.rx_text) .addDisposableTo(disposeBag) |
是不是看上去很优雅呢?
另外这篇文章中也有一个类似的例子:
对应的代码是:
1 2 3 4 5 6 |
button .rx_tap // 点击登录 .flatMap(provider.login) // 登录请求 .map(saveToken) // 保存 token .flatMap(provider.requestInfo) // 获取用户信息 .subscribe(handleResult) // 处理结果 |
用一连串的链式调用就把一系列事件处理了,是不是很不错。
Moya
Moya
是 Artsy 团队的 Ash Furrow 主导开发的一个网络抽象层库。它在 Alamofire 基础上提供了一系列简单的抽象接口,让客户端代码不用去直接调用 Alamofire,也不用去关心 NSURLSession。同时提供了很多实用的功能。
它的 Target -> Endpoint -> Request
模式也使得每个请求都可以自由定制。
下面进入正题:
创建一个请求
Moya 的 TargetType
协议规定的创建网络请求的方法,用枚举来创建,很有 Swift 的风格。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
enum DataAPI { case Data } extension DataAPI: TargetType { var baseURL: NSURL { return NSURL(string: "http://localhost:3000")! } var path: String { return "/data" } var method: Moya.Method { return .GET } var parameters: [String : AnyObject]? { return nil } var sampleData: NSData { return stubbedResponseFromJSONFile("stub_data") } var multipartBody: [Moya.MultipartFormData]? { return nil } } |
创建数据模型
数据模型的创建用了 SwiftyJSON
和 Moya_SwiftyJSONMapper
,方便将 JSON 直接映射成 Model 对象。
1 2 3 4 5 6 7 8 9 10 |
struct DataModel: ALSwiftyJSONAble { var title: String? var content: String? init?(jsonData: JSON) { self.title = jsonData["title"].string self.content = jsonData["content"].string } } |
发送请求
我们可使用 Moya 自带一个 RxSwift 的扩展来发送请求。
1 2 3 4 style="font-size: 13px !important; line-height: 15px !important;"> 1 2 3 4 非常的好看优雅。
举个例子,有如下操作: 代码如下:
是不是看上去很优雅呢? 另外这篇文章中也有一个类似的例子: 对应的代码是:
用一连串的链式调用就把一系列事件处理了,是不是很不错。 Moya
下面进入正题: 创建一个请求Moya 的
创建数据模型数据模型的创建用了
发送请求我们可使用 Moya 自带一个 RxSwift 的扩展来发送请求。
|