1:timeline时间轴
1)Alamofire的时间轴记录请求从生到死的时间节点信息,(时光🐔🐔🐔🐔🐔)。
public init(
requestStartTime: CFAbsoluteTime = 0.0,
initialResponseTime: CFAbsoluteTime = 0.0,
requestCompletedTime: CFAbsoluteTime = 0.0,
serializationCompletedTime: CFAbsoluteTime = 0.0)
{
self.requestStartTime = requestStartTime //初始化请求时间
self.initialResponseTime = initialResponseTime // 从服务器接收或发送第一个字节的时间
self.requestCompletedTime = requestCompletedTime // 请求完成时间
self.serializationCompletedTime = serializationCompletedTime // 响应序列化完成时间
self.latency = initialResponseTime - requestStartTime //从请求开始到服务器的初始响应的时间间隔(以秒为单位)
self.requestDuration = requestCompletedTime - requestStartTime//从请求开始到请求完成的时间间隔(以秒为单位)
self.serializationDuration = serializationCompletedTime - requestCompletedTime // 从请求完成到响应序列化完成的时间间隔
self.totalDuration = serializationCompletedTime - requestStartTime // 从请求开始到完成时间响应序列化的时间间隔
}
2)应用
Request的扩展
extension Request {
var timeline: Timeline {
let requestStartTime = self.startTime ?? CFAbsoluteTimeGetCurrent()
let requestCompletedTime = self.endTime ?? CFAbsoluteTimeGetCurrent()
let initialResponseTime = self.delegate.initialResponseTime ?? requestCompletedTime
return Timeline(
requestStartTime: requestStartTime, //调用resume的时候开启
initialResponseTime: initialResponseTime, //queue.addOperation 控制
requestCompletedTime: requestCompletedTime, // timeline()
serializationCompletedTime: CFAbsoluteTimeGetCurrent() // response回调发起的时间
)
}
}
response 调用
timeline: Timeline = Timeline(),
2:adapter适配器和retrier重连
RequestAdapter 请求适配器,目的是自定义修改请求,一个典型的例子是为每一个请求调价Token请求头
RequestRetrier 请求重试器, 目的是控制请求的重试机制,一个典型的例子是当某个特殊的请求失败后,是否重试。
遵守RequestAdapter、RequestRetrier协议,内容需要自己实现
public protocol RequestAdapter {
func adapt(_ urlRequest: URLRequest) throws -> URLRequest
}
public protocol RequestRetrier {
func should(_ manager: SessionManager, retry request: Request, with error: Error, completion: @escaping RequestRetryCompletion)
}
具体使用
class LGAdapter: RequestAdapter,RequestRetrier{
func should(_ manager: SessionManager, retry request: Request, with error: Error, completion: @escaping RequestRetryCompletion) {
print("manager = \(manager)")
print("request = \(request)")
print("error = \(error)")
completion(true,1)
completion(false,0)
}
func adapt(_ urlRequest: URLRequest) throws -> URLRequest {
// token
// 1: request 处理
// 2: request 重定向
var request = urlRequest
request.setValue("lgcoociToken", forHTTPHeaderField: "lgtoken")
let newUrlRequest = URLRequest.init(url: URL(string: "http://www.douban.com/j/app/radio/channels")!)
return newUrlRequest
}
}
在使用的时候直接调用。
3:request
1)DataRequest
2)DownloadRequest
public enum Result<Value> {
case success(Value)
case failure(Error)
/// Returns `true` if the result is a success, `false` otherwise.
public var isSuccess: Bool {
switch self {
case .success:
return true
case .failure:
return false
}
}
/// Returns `true` if the result is a failure, `false` otherwise.
public var isFailure: Bool {
return !isSuccess
}
/// Returns the associated value if the result is a success, `nil` otherwise.
public var value: Value? {
switch self {
case .success(let value):
return value
case .failure:
return nil
}
}
/// Returns the associated error value if the result is a failure, `nil` otherwise.
public var error: Error? {
switch self {
case .success:
return nil
case .failure(let error):
return error
}
}
}
//标示请求成功或者失败,成功有成功Value失败有失败的Error。
4:response
1)DataResponse
dataResponse.jpg
2)DefaultDownloadResponse
3)DownloadResponse
4)DefaultDataResponse
网友评论