Swift - 异步编程库PromiseKit使用详解6(Alamofire的扩展)
作者:hangge | 2018-12-14 08:10
作为一个流行的 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)
}
全部评论(0)