返回 导航

Swift

hangge.com

Swift - 异步编程库PromiseKit使用详解6(Alamofire的扩展)

作者:hangge | 2018-12-14 08:10
    作为一个流行的 HTTP 网络操作库,Alamofire 深受许多 Swift 开发人员的喜爱。PromiseKit 同样也对 Alamofire 进行了扩展,方便我们使用。

七、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)

回到顶部