Swift - 异步编程库PromiseKit使用详解6(Alamofire的扩展)
作为一个流行的 HTTP 网络操作库,Alamofire 深受许多 Swift 开发人员的喜爱。PromiseKit 同样也对 Alamofire 进行了扩展,方便我们使用。
(2)下面样例获取 Data 类型数据,不过我们又将其转成字符串,因此运行结果同上。
(2)运行结果如下:
七、Alamofire 的扩展
1,安装配置
(1)首先要安装 Alamofire 和 PromiseKit 这两个库 ,具体步骤可以参考我之前的文章:
(2)接着安装 PromiseKit 的 Alamofire 扩展库,从 GitHub 上下载最新的代码:
(3)将下载下来的源码包中 PMKAlamofire.xcodeproj 拖拽至你的工程中
(4)工程 -> General -> Embedded Binaries 项,把 PMKAlamofire.framework 添加进来。
(5)最后,在需要使用扩展的地方将其 import 进来就可以了
import PMKAlamofire
2,基本用法
(1)下面样例获取 String 类型的数据。
import UIKit import Alamofire import PromiseKit import PMKAlamofire class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() _ = Alamofire.request("https://httpbin.org/get", parameters: ["foo": "bar"]) .responseString() .done { str, response in print("--- 请求结果 ---") print(str) }.catch{ error in print("--- 请求失败 ---") print(error) } } }
(2)下面样例获取 Data 类型数据,不过我们又将其转成字符串,因此运行结果同上。
_ = Alamofire.request("https://httpbin.org/get", parameters: ["foo": "bar"]) .responseData() .done { data, response in print("--- 请求结果 ---") if let str = String(data: data, encoding: .utf8) { print(str) } }.catch{ error in print("--- 请求失败 ---") print(error) }
3,自动解析 json 数据
_ = Alamofire.request("https://httpbin.org/get", parameters: ["foo": "bar"]) .responseJSON() .done { json, response in print("--- 请求结果 ---") if let dic = json as? Dictionary<String, Any> { print("url:",dic["url"] ?? "") print("origin:",dic["origin"] ?? "") } }.catch{ error in print("--- 请求失败 ---") print(error) }
4,将请求结果转成模型对象
import UIKit import Alamofire import PromiseKit import PMKAlamofire class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() _ = Alamofire.request("https://httpbin.org/get", parameters: ["foo": "bar"]) .responseDecodable(HttpBin.self) .done { httpBin in print("--- 请求结果 ---") print("url:", httpBin.url) print("origin:", httpBin.origin) }.catch{ error in print("--- 请求失败 ---") print(error) } } } //请求结果对象 struct HttpBin: Codable { var origin: String var url: String }
附:进阶技巧
1,结合 when() 方法同时请求多个数据
(1)下面样例我们同时发起多个网络请求,等它们都返回后再一起处理。
import UIKit import Alamofire import PromiseKit import PMKAlamofire class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() when(fulfilled: fetchData(parameters: ["foo": "bar"]), fetchData(parameters: ["name": "hangge"])) .done { str1, str2 in print("--- 请求结果1 ---") print(str1) print("--- 请求结果2 ---") print(str2) }.catch{ error in print("--- 请求失败 ---") print(error) } } //请求数据 func fetchData(parameters: [String: String]) -> Promise<String>{ return Alamofire.request("https://httpbin.org/get", parameters: parameters) .responseString() .map{ $0.string } } }
(2)运行结果如下:
2,结合 ensure() 方法隐藏活动指示器
我们常常需要在发起网络请求时显示个活动指示器告知用户,等到请求结束后又将其隐藏。而隐藏这块代码我们可以放在 ensure() 方法中执行。
ensure 与 finally 比较:
- 相同点在于:它们都是不管前面是成功(fulfilled)还是失败(rejected)都会被执行
- 不同点在于:ensure 是链式的,后面可以继续跟其它的操作,而 finally 不是。
//显示网络请求活动指示器 UIApplication.shared.isNetworkActivityIndicatorVisible = true _ = Alamofire.request("https://httpbin.org/get", parameters: ["foo": "bar"]) .responseString() .ensure { //隐藏网络请求活动指示器 UIApplication.shared.isNetworkActivityIndicatorVisible = false } .done { str, response in print("--- 请求结果 ---") print(str) }.catch{ error in print("--- 请求失败 ---") print(error) }