Alamofire-初探

2019-08-16  本文已影响0人  yahibo
Alamofire.png

对于iOS开发者来说,AFNetworking是我们大家所熟知的,而Alamofire呢?Alamofire框架其实就是AFNetworking兄弟,出自于同一个作者。既是同一个作者,那么他们的使用方法,框架结构上应该也是保持一致的。AFNetworkingAlamofire

一、网络请求步骤

  1. 设置请求url
  2. 设置URLRequest对象,配置请求相关信息
  3. 创建会话配置URLSessionConfiguration
  4. 创建会话URLSession
  5. 创建任务和设置请求回调,并发起请求

一般通过以上几个步来完成网络请求,当然要根据不同应用场景来配置请求属性。

二、体验

发起一个请求:

func responseData() {
    let url = "http://onapp.yahibo.top/public/?s=api/test/list"
    Alamofire.request(url).responseJSON {
        (response) in
        switch response.result{
        case .success(let json):
            print("json:\(json)")
            let dict = json as! Dictionary<String, Any>
            let list = dict["data"] as! Array<AnyObject>
            guard let result = [UserModel1].deserialize(from: list) else{return}
            self.observable.onNext(result as [Any])
            break
        case .failure(let error):
            print("error:\(error)")
            break
        }
    }
}

直接通过Alamofire发起请求通过一个闭包返回请求结果,不需要二次封装使用简单。这里我们没有标明请求类型,没有请求参数,那Alamofire是如何封装这些请求参数的呢,点击进入查看方法定义:

public func request(
    _ url: URLConvertible,
    method: HTTPMethod = .get,
    parameters: Parameters? = nil,
    encoding: ParameterEncoding = URLEncoding.default,
    headers: HTTPHeaders? = nil)
    -> DataRequest
{
    return SessionManager.default.request(
        url,
        method: method,
        parameters: parameters,
        encoding: encoding,
        headers: headers
    )
}

这里已经提供了请求所需要的参数,并设置了默认值,因此外界在没有指定方法时默认为get方式。根据实际开发需求设置响应的参数:

Alamofire.request(url,method: .post,parameters: ["page":"1","size":"20"]).responseJSON

这是我们开发中常见的设置请求方式,请求参数,这里的url支持多种数据类型,可以是String、URL、URLRequest等类型,为什么这么设计呢?因为在项目中可能当前我们跟前有一个String类型的连接,也有可能是个URL类型的连接,这时候在不需要转换的情况下就可以直接使用,方便快捷,更加灵活。

效果如下:

Alamofire.gif

三、URLSession

同样在Alamofire中也是对URLSession封装的,在OC中为NSURLSession,其实是一样的。一般网络请求分三个步骤:

1、设置URL请求地址
let url = URL.init(string: "协议://主机地址/路径/参数1&参数2")!
2、设置URLRequest属性
var request  = URLRequest.init(url: url)
request.httpMethod = HTTPMethod.post.rawValue
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
let postData = ["username":"hibo","password":"123456"]
request.httpBody = try?JSONSerialization.data(withJSONObject: postData, options: [])
request.timeoutInterval = 30
request.cachePolicy = .useProtocolCachePolicy

通过以上的参数设置,能够感受到发送一次请求是多么不容易,因此网络请求是必须要被封装的

3、发起请求
URLSession.shared.dataTask(with: request) { (data, response, error) in
    print("*******网络请求*******")
    do {
        let list =  try JSONSerialization.jsonObject(with: data!, options: .allowFragments)
        print(list)
    }catch{
        print(error)
    }
}.resume()

四、URLSessionConfiguration

URLSession.shared中内部已经配置了该项,此项为会话配置项,一般使用都会进行配置以适用于不同场景。查看该类如下:

open class var `default`: URLSessionConfiguration { get }
open class var ephemeral: URLSessionConfiguration { get }
@available(iOS 8.0, *)
open class func background(withIdentifier identifier: String) -> URLSessionConfiguration

创建一个会话:

let configuration = URLSessionConfiguration.background(withIdentifier: "request_id")
let session = URLSession.init(configuration: configuration, delegate: self, delegateQueue: OperationQueue.main)
session.dataTask(with: request) { (data, response, error) in
    print("*******网络请求*******")
    do {
        let list =  try JSONSerialization.jsonObject(with: data!, options: .allowFragments)
        print(list)
    }catch{
        print(error)
    }
}.resume()

下载任务:

let configuration = URLSessionConfiguration.background(withIdentifier: "request_id")
let session = URLSession.init(configuration: configuration, delegate: self, delegateQueue: OperationQueue.main)
session.downloadTask(with: url).resume()

注意在使用background模式时一定要开启后台下载权限,否则无法完成后台下载并回调数据。需要以下两步才能完成:

1、开启后台下载权限

var backgroundHandler: (()->Void)? = nil
//设置此处开启后台下载权限
func application(_ application: UIApplication, handleEventsForBackgroundURLSession identifier: String, completionHandler: @escaping () -> Void) {
    self.backgroundHandler = completionHandler
}

2、实现SessionDelegate代理方法,调用闭包方法,通知系统更新屏幕

func urlSessionDidFinishEvents(forBackgroundURLSession session: URLSession) {
    print("后台任务下载回来")
    DispatchQueue.main.async {
        guard let appDelegate = UIApplication.shared.delegate as? AppDelegate, let backgroundHandle = appDelegate.backgroundHandler else { return }
        backgroundHandle()
    }
}

苹果官方给出需要实现以上两个方法来完成后台下载,通知系统及时更新屏幕。官方文档

五、相关属性

官方文档

1、常规属性

2、设置Cookie策略

3、设置安全策略

4、设置缓存策略

5、支持后台转移

6、支持自定义协议

7、支持多路径TCP

8、设置HTTP策略和代理属性

9、支持连接更改

一个请求任务就有如此多的配置属性,可想而知对一个网络框架的整合,工作量也是非常大的。接下来我们就一步步来了解一下Alamofire是如何一步步整合的。

上一篇 下一篇

猜你喜欢

热点阅读