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._url是URLConvertible协议的类型,不是固定的某一个类型。
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设计中可以借鉴。
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.Alamofire对SessionManager.default的封装,为什么不直接使用?
主要是为了降低门槛,拿到框架最直接要做的事就是发请求,正常思维能想到Alamofire.request 直接使用.
5.Alamofire模块在这个作用域里提供了提供request,download,upload等很多方法。
Alamofire.request中内部中转,处理的实际类型是SessionManager.default
Alamofire提供request,download,upload.使用装饰者模式。









网友评论