Alamofire-初探

2019-08-20  本文已影响0人  king_jensen

Alamofire的使用

  let urlStr = "xxx"
   Alamofire.request(urlStr)
            .responseJSON { (response) in
            print(response)
        }

URLSession的写法有什么不一样?
1.简单。一步到位省略(URLSession创建,DataTask创建等)步骤。
2.采用链式语法
3.直接返回JSON
4.参数直接是字符串类型的urlStr

Alamofire.request实现分析

request的源码:

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
    )
}

1._urlURLConvertible协议的类型,不是固定的某一个类型。

public protocol URLConvertible {
    /// Returns a URL that conforms to RFC 2396 or throws an `Error`.
    ///
    /// - throws: An `Error` if the type cannot be converted to a `URL`.
    ///
    /// - returns: A URL or throws an `Error`.
    func asURL() throws -> URL
}

extension String: URLConvertible {
    /// Returns a URL if `self` represents a valid URL string that conforms to RFC 2396 or throws an `AFError`.
    ///
    /// - throws: An `AFError.invalidURL` if `self` is not a valid URL string.
    ///
    /// - returns: A URL or throws an `AFError`.
    public func asURL() throws -> URL {
        guard let url = URL(string: self) else { throw AFError.invalidURL(url: self) }
        return url
    }
}

extension URL: URLConvertible {
    /// Returns self.
    public func asURL() throws -> URL { return self }
}

extension URLComponents: URLConvertible {
    /// Returns a URL if `url` is not nil, otherwise throws an `Error`.
    ///
    /// - throws: An `AFError.invalidURL` if `url` is `nil`.
    ///
    /// - returns: A URL or throws an `AFError`.
    public func asURL() throws -> URL {
        guard let url = url else { throw AFError.invalidURL(url: self) }
        return url
    }
}

String,URL,URLComponents都进行扩展,实现asURL()方法。让用户使用起来更方便,传递String,URL,URLComponents类型都是没有问题的。这种设计思维在SDK设计中可以借鉴。

  1. method: HTTPMethod = .get
public enum HTTPMethod: String {
    case options = "OPTIONS"
    case get     = "GET"
    case head    = "HEAD"
    case post    = "POST"
    case put     = "PUT"
    case patch   = "PATCH"
    case delete  = "DELETE"
    case trace   = "TRACE"
    case connect = "CONNECT"
}

枚举的属性值关联,这里的.get就是GET

3.Alamofire.request直接使用,Alamofire是什么?
Alamofire只是一个模块导入,cocopods模块就具备这个功能。

4.AlamofireSessionManager.default的封装,为什么不直接使用?
主要是为了降低门槛,拿到框架最直接要做的事就是发请求,正常思维能想到Alamofire.request 直接使用.

5.Alamofire模块在这个作用域里提供了提供requestdownloadupload等很多方法。
Alamofire.request中内部中转,处理的实际类型是SessionManager.default
Alamofire提供requestdownloadupload.使用装饰者模式。

上一篇 下一篇

猜你喜欢

热点阅读