Alamofire源码导读三:返回的处理逻辑

以DataRequest
为例子。
最简单的返回
URLSession
有一个方法,可以构建 URLSessionDataTask
func dataTask(with url: URL, completionHandler: @escaping (Data?, URLResponse?, Error?) -> Void) -> URLSessionDataTask
DataRequest
也提供了类似的调用。
@discardableResult
public func response(queue: DispatchQueue? = nil, completionHandler: @escaping (DefaultDataResponse) -> Void) -> Self {
delegate.queue.addOperation {
(queue ?? DispatchQueue.main).async {
var dataResponse = DefaultDataResponse(
request: self.request,
response: self.response,
data: self.delegate.data,
error: self.delegate.error,
timeline: self.timeline
)
dataResponse.add(self.delegate.metrics)
completionHandler(dataResponse)
}
}
return self
}
DefaultDataResponse
这个结构体中,可以获取想要的一切信息,比如data
、error
、response
等。
还包括统计信息,timeline
和 metrics
。
对返回的 Data 做处理
有时候,我们希望对返回的数据做处理。这个框架也提供了这样子的功能,并提供了一些默认实现。
public func response<T: DataResponseSerializerProtocol>(
queue: DispatchQueue? = nil,
responseSerializer: T,
completionHandler: @escaping (DataResponse<T.SerializedObject>) -> Void)
-> Self
{
delegate.queue.addOperation {
let result = responseSerializer.serializeResponse(
self.request,
self.response,
self.delegate.data,
self.delegate.error
)
var dataResponse = DataResponse<T.SerializedObject>(
request: self.request,
response: self.response,
data: self.delegate.data,
result: result,
timeline: self.timeline
)
dataResponse.add(self.delegate.metrics)
(queue ?? DispatchQueue.main).async { completionHandler(dataResponse) }
}
return self
}
如上代码所示,先对返回的数据做序列化,然后构建一个序列化后的返回,最后用序列化后的结果进行回调。
框架提供的几个序列化处理
- responseData
只是校验了返回数据 responseJSON
把返回数据转化为JSON对象let json = try JSONSerialization.jsonObject(with: validData, options: options) return .success(json)
responseString
把返回数据转化为String
responsePlist 把返回数据转为 plist 对象
let plist = try PropertyListSerialization.propertyList(from: validData, options: options, format: nil) return .success(plist)
下起雨,也要勇敢前行