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)
 
Alamofire源码导读三:返回的处理逻辑的更多相关文章
- Alamofire源码导读一:框架
		源码架构  Alamofire 的源码包括 Core.Extensions.Features.Supporting Files.其中主要逻辑在 Core里. 包括构造请求,发起请求,处理回调等. C ... 
- Alamofire源码导读五:错误表示
		AFError is the error type returned by Alamofire. It encompasses a few different types of errors, eac ... 
- Alamofire源码导读二:发起请求及内部加锁的逻辑
		以创建一个 DataRequest 为例子  发起请求 创建 SessionManager 顺带也创建了一个 SessionDelegate 持有一个urlSession,持有一个串行的 Dispa ... 
- Alamofire源码导读四:统计信息
		 时间顺序如上图: self.latency = initialResponseTime - requestStartTime self.requestDuration = requestCompl ... 
- Alamofire源码解读系列(三)之通知处理(Notification)
		本篇讲解swift中通知的用法 前言 通知作为传递事件和数据的载体,在使用中是不受限制的.由于忘记移除某个通知的监听,会造成很多潜在的问题,这些问题在测试中是很难被发现的.但这不是我们这篇文章探讨的主 ... 
- springMVC源码分析--ViewNameMethodReturnValueHandler返回值处理器(三)
		之前两篇博客springMVC源码分析--HandlerMethodReturnValueHandler返回值解析器(一)和springMVC源码分析--HandlerMethodReturnValu ... 
- iOS开发之Alamofire源码深度解析
		今天博客中的Alamofire源码的版本是以现在最新的3.4版本为例.上篇博客系统的对NSURLSession相关的东西进行了详细的解析,详情请看<详解NSURLSession>,为了就是 ... 
- iOS开发之Alamofire源码解析前奏--NSURLSession全家桶
		今天博客的主题不是Alamofire, 而是iOS网络编程中经常使用的NSURLSession.如果你想看权威的NSURLSession的东西,那么就得去苹果官方的开发中心去看了,虽然是英文的,但是结 ... 
- Alamofire源码解读系列(四)之参数编码(ParameterEncoding)
		本篇讲解参数编码的内容 前言 我们在开发中发的每一个请求都是通过URLRequest来进行封装的,可以通过一个URL生成URLRequest.那么如果我有一个参数字典,这个参数字典又是如何从客户端传递 ... 
随机推荐
- 16款值得一用的iPhone线框图模板 (PSD & Sketch)
			在任何网站或移动应用设计的过程中,线框图作为设计元素和功能的图示,它有助于帮助定义和更好地传达信息层次结构,让参与设计和开发的人员更好的理解设计师的思路和设计的功能点. 即使线框图设计是一个比较耗时的 ... 
- linux小白
			1. linux下加域名. 文件是在/etc/hosts 中间加的tab键 192.168.0.1 baidu.com linux下测试网页可以用 wget www.baidu.com 这个命 ... 
- String [] args是干什么的
			我相信应该有不少人都疑惑,main后面的这个String [] args是干什么的呢?今天,巩固就为你们解密. 这是干什么的呢?先给大家一个简单定义(本人比较讨厌上来就举例子,因为 ... 
- SQLALchemy--ORM框架
			SQLAlchemy 1.介绍 SQLAlchemy是一个基于Python实现的ORM框架.该框架建立在 DB API之上,使用关系对象映射进行数据库操作,简言之便是:将类和对象转换成SQL,然后使用 ... 
- 2018.09.30 bzoj2288:生日礼物(贪心+线段树)
			传送门 线段树经典题目. 每次先找到最大子段和来更新答案,然后利用网络流反悔退流的思想把这个最大字段乘-1之后放回去. 代码: #include<bits/stdc++.h> #defin ... 
- js级联出生日期
			<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ... 
- b2_trsd_EDSD_new
			# -*- coding:utf-8 -*- import re ss="./data/" year = '17A' filename = ss+'EDSD%s.txt'%year ... 
- 极小极大搜索方法、负值最大算法和Alpha-Beta搜索方法
			1. 极小极大搜索方法 一般应用在博弈搜索中,比如:围棋,五子棋,象棋等.结果有三种可能:胜利.失败和平局.暴力搜索,如果想通过暴力搜索,把最终的结果得到的话,搜索树的深度太大了,机器不能满足, ... 
- struts2和JSON的数据交互
			一.实验环境 1.struts2基本包 2.json-plugin 在struts2的lib下可以找到. 3.web.xml 加入struts2 <filter> <filter-n ... 
- Codeforces805D. Minimum number of steps                                                                                            2017-05-05 08:46             240人阅读              评论(0)              收藏
			D. Minimum number of steps time limit per test 1 second memory limit per test 256 megabytes input st ... 
