首先定義了兩個(gè)協(xié)議DataResponseSerializerProtocol和DownloadResponseSerializerProtocol,以及這兩個(gè)協(xié)議的實(shí)現(xiàn)類型,這兩個(gè)協(xié)議都有一個(gè)serializeResponse屬性,返回Result<Value>的閉包。
extension DataRequest
其中兩個(gè)方法添加完成操作到delegate.queue
public func response(queue: DispatchQueue? = nil, completionHandler:
@escaping (DefaultDataResponse) -> Void) -> Self
public func response<T: DataResponseSerializerProtocol>(
queue: DispatchQueue? = nil,
responseSerializer: T,
completionHandler: @escaping
(DataResponse<T.SerializedObject>) -> Void)
-> Self
DownloadRequest
也有兩個(gè)方法,都是一樣的結(jié)構(gòu)
public func response(
queue: DispatchQueue? = nil,
completionHandler: @escaping (DefaultDownloadResponse) -> Void)
-> Self
public func response<T: DownloadResponseSerializerProtocol>(
queue: DispatchQueue? = nil,
responseSerializer: T,
completionHandler: @escaping (DownloadResponse<T.SerializedObject>) -> Void)
-> Self
下面的代碼有四部分對應(yīng)返回?cái)?shù)據(jù)解析的四種類型
- Data
- String
- JSON
- Property List
這四部分代碼都是相同的結(jié)構(gòu),這里以Data為例。
Data
Request的擴(kuò)展類方法返回Result<Data>
public static func serializeResponseData(response: HTTPURLResponse?, data: Data?, error: Error?) -> Result<Data> {
guard error == nil else { return .failure(error!) }
if let response = response, emptyDataStatusCodes.contains(response.statusCode) { return .success(Data()) }
guard let validData = data else {
return .failure(AFError.responseSerializationFailed(reason: .inputDataNil))
}
return .success(validData)
}
extension DataRequest {
/// Creates a response serializer that returns the associated data as-is.
///
/// - returns: A data response serializer.
public static func dataResponseSerializer() -> DataResponseSerializer<Data> {
return DataResponseSerializer { _, response, data, error in
return Request.serializeResponseData(response: response, data: data, error: error)
}
}
/// Adds a handler to be called once the request has finished.
///
/// - parameter completionHandler: The code to be executed once the request has finished.
///
/// - returns: The request.
@discardableResult
public func responseData(
queue: DispatchQueue? = nil,
completionHandler: @escaping (DataResponse<Data>) -> Void)
-> Self
{
return response(
queue: queue,
responseSerializer: DataRequest.dataResponseSerializer(),
completionHandler: completionHandler
)
}
}
調(diào)用上面定義的response方法