当前位置: 首页 > 编程日记 > 正文

源码阅读:AFNetworking(十六)——UIWebView+AFNetworking

该文章阅读的AFNetworking的版本为3.2.0。

这个分类提供了对请求周期进行控制的方法,包括进度监控、成功和失败的回调。

1.接口文件

1.1.属性

/**网络会话管理者对象*/
@property (nonatomic, strong) AFHTTPSessionManager *sessionManager;
复制代码

1.2.方法

/**异步加载指定请求*/
- (void)loadRequest:(NSURLRequest *)requestprogress:(NSProgress * _Nullable __autoreleasing * _Nullable)progresssuccess:(nullable NSString * (^)(NSHTTPURLResponse *response, NSString *HTML))successfailure:(nullable void (^)(NSError *error))failure;/**以指定MIME类型和指定文本编码格式异步加载指定请求*/
- (void)loadRequest:(NSURLRequest *)requestMIMEType:(nullable NSString *)MIMETypetextEncodingName:(nullable NSString *)textEncodingNameprogress:(NSProgress * _Nullable __autoreleasing * _Nullable)progresssuccess:(nullable NSData * (^)(NSHTTPURLResponse *response, NSData *data))successfailure:(nullable void (^)(NSError *error))failure;
复制代码

2.UIWebView+_AFNetworking私有分类

2.1.接口

/**保存任务对象*/
@property (readwrite, nonatomic, strong, setter = af_setURLSessionTask:) NSURLSessionDataTask *af_URLSessionTask;
复制代码

2.2.实现

这两个方法就是通过Runtime的关联对象为分类添加属性保存任务对象

- (NSURLSessionDataTask *)af_URLSessionTask {return (NSURLSessionDataTask *)objc_getAssociatedObject(self, @selector(af_URLSessionTask));
}- (void)af_setURLSessionTask:(NSURLSessionDataTask *)af_URLSessionTask {objc_setAssociatedObject(self, @selector(af_URLSessionTask), af_URLSessionTask, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
复制代码

3.方法实现

  • 属性的访问方法

下面的这四个方法同样是通过关联对象为分类添加属,分别是保存网络会话管理者对象和响应序列化对象

- (AFHTTPSessionManager  *)sessionManager {static AFHTTPSessionManager *_af_defaultHTTPSessionManager = nil;static dispatch_once_t onceToken;dispatch_once(&onceToken, ^{_af_defaultHTTPSessionManager = [[AFHTTPSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];_af_defaultHTTPSessionManager.requestSerializer = [AFHTTPRequestSerializer serializer];_af_defaultHTTPSessionManager.responseSerializer = [AFHTTPResponseSerializer serializer];});return objc_getAssociatedObject(self, @selector(sessionManager)) ?: _af_defaultHTTPSessionManager;
}- (void)setSessionManager:(AFHTTPSessionManager *)sessionManager {objc_setAssociatedObject(self, @selector(sessionManager), sessionManager, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}- (AFHTTPResponseSerializer <AFURLResponseSerialization> *)responseSerializer {static AFHTTPResponseSerializer <AFURLResponseSerialization> *_af_defaultResponseSerializer = nil;static dispatch_once_t onceToken;dispatch_once(&onceToken, ^{_af_defaultResponseSerializer = [AFHTTPResponseSerializer serializer];});return objc_getAssociatedObject(self, @selector(responseSerializer)) ?: _af_defaultResponseSerializer;
}- (void)setResponseSerializer:(AFHTTPResponseSerializer<AFURLResponseSerialization> *)responseSerializer {objc_setAssociatedObject(self, @selector(responseSerializer), responseSerializer, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
复制代码
  • 接口方法实现
- (void)loadRequest:(NSURLRequest *)requestprogress:(NSProgress * _Nullable __autoreleasing * _Nullable)progresssuccess:(NSString * (^)(NSHTTPURLResponse *response, NSString *HTML))successfailure:(void (^)(NSError *error))failure
{// 调用下面的方法[self loadRequest:request MIMEType:nil textEncodingName:nil progress:progress success:^NSData *(NSHTTPURLResponse *response, NSData *data) {// 设置字符编码方式为UTF8NSStringEncoding stringEncoding = NSUTF8StringEncoding;// 如果响应对象有文本编码方式,就将字符编码方式设置为响应的文本编码方式if (response.textEncodingName) {CFStringEncoding encoding = CFStringConvertIANACharSetNameToEncoding((CFStringRef)response.textEncodingName);if (encoding != kCFStringEncodingInvalidId) {stringEncoding = CFStringConvertEncodingToNSStringEncoding(encoding);}}// 将返回的数据进行编码NSString *string = [[NSString alloc] initWithData:data encoding:stringEncoding];// 如果设置了成功回调就调用block传递数据if (success) {string = success(response, string);}// 将字符串编码成二进制数据后返回return [string dataUsingEncoding:stringEncoding];} failure:failure];
}- (void)loadRequest:(NSURLRequest *)requestMIMEType:(NSString *)MIMETypetextEncodingName:(NSString *)textEncodingNameprogress:(NSProgress * _Nullable __autoreleasing * _Nullable)progresssuccess:(NSData * (^)(NSHTTPURLResponse *response, NSData *data))successfailure:(void (^)(NSError *error))failure
{// 在debug模式下缺少参数就crashNSParameterAssert(request);// 如果当前已经有任务正在进行或者已经暂停,就取消掉这个任务,并将保存它的属性置空if (self.af_URLSessionTask.state == NSURLSessionTaskStateRunning || self.af_URLSessionTask.state == NSURLSessionTaskStateSuspended) {[self.af_URLSessionTask cancel];}self.af_URLSessionTask = nil;// 生成任务__weak __typeof(self)weakSelf = self;__block NSURLSessionDataTask *dataTask;dataTask = [self.sessionManagerdataTaskWithRequest:requestuploadProgress:nildownloadProgress:nilcompletionHandler:^(NSURLResponse * _Nonnull response, id  _Nonnull responseObject, NSError * _Nullable error) {__strong __typeof(weakSelf) strongSelf = weakSelf;// 如果出错就调用失败回调blockif (error) {if (failure) {failure(error);}// 如果成功} else {// 先调用成功回调blockif (success) {success((NSHTTPURLResponse *)response, responseObject);}// 调用UIWebView加载本地数据的方式进行加载页面[strongSelf loadData:responseObject MIMEType:MIMEType textEncodingName:textEncodingName baseURL:[dataTask.currentRequest URL]];// 调用UIWebView代理中的完成加载方法if ([strongSelf.delegate respondsToSelector:@selector(webViewDidFinishLoad:)]) {[strongSelf.delegate webViewDidFinishLoad:strongSelf];}}}];// 用属性保存任务对象self.af_URLSessionTask = dataTask;// 如果设置了进度对象,就获取到网络会话管理者的下载进程对象if (progress != nil) {*progress = [self.sessionManager downloadProgressForTask:dataTask];}// 启动任务[self.af_URLSessionTask resume];// 调用UIWebView代理中的开始加载方法if ([self.delegate respondsToSelector:@selector(webViewDidStartLoad:)]) {[self.delegate webViewDidStartLoad:self];}复制代码

4.总结

看完这个分类的源码,我们可以看到这个分类做的事就是,手动实现了UIWebView加载网络数据的过程,从而可以监听进度和通过block回调处理成功与失败的结果。

通常,我们会使用loadRequest:方法加载指定页面,然后通过UIWebViewDelegate中的方法监听网页加载的开始、结束与失败。

而这个分类,通过AFHTTPSessionManager类手动生成NSURLSessionDataTask对象下载网页的二进制数据,然后通过loadData: MIMEType: textEncodingName: baseURL:方法加载已经下载到本地的网页的二进制数据。在这个过程中通过AFHTTPSessionManager类中已经实现的方法实现进度的监控、成功和失败的回调。

源码阅读系列:AFNetworking

源码阅读:AFNetworking(一)——从使用入手

源码阅读:AFNetworking(二)——AFURLRequestSerialization

源码阅读:AFNetworking(三)——AFURLResponseSerialization

源码阅读:AFNetworking(四)——AFSecurityPolicy

源码阅读:AFNetworking(五)——AFNetworkReachabilityManager

源码阅读:AFNetworking(六)——AFURLSessionManager

源码阅读:AFNetworking(七)——AFHTTPSessionManager

源码阅读:AFNetworking(八)——AFAutoPurgingImageCache

源码阅读:AFNetworking(九)——AFImageDownloader

源码阅读:AFNetworking(十)——AFNetworkActivityIndicatorManager

源码阅读:AFNetworking(十一)——UIActivityIndicatorView+AFNetworking

源码阅读:AFNetworking(十二)——UIButton+AFNetworking

源码阅读:AFNetworking(十三)——UIImageView+AFNetworking

源码阅读:AFNetworking(十四)——UIProgressView+AFNetworking

源码阅读:AFNetworking(十五)——UIRefreshControl+AFNetworking

源码阅读:AFNetworking(十六)——UIWebView+AFNetworking

相关文章:

腾讯微博快速有效增加广播转播量的方法与技巧

经过一段时间对腾讯微博的实践&#xff0c;对腾讯微博也算是有所收获&#xff0c;要做好腾讯微博&#xff0c;无非就是两个方面&#xff0c;一是增加听众数&#xff0c;二是增加广播的转播量&#xff0c;本篇写的是做好微博质量–即增加转播量的方法。增加转播量不像增加听众数…

详解 | 推荐系统的工程实现

作者 | gongyouliu 来源 | 大数据工程师01 写在前面本篇文章作者会结合多年推荐系统开发的实践经验粗略介绍推荐系统的工程实现&#xff0c;简要说明要将推荐系统很好地落地到产品中需要考虑哪些问题及相应的思路、策略和建议,其中有大量关于设计哲学的思考,希望对从事推荐算法…

【linux】Valgrind工具集详解(六):使用Valgrind gdbserver和GDB调试程序

一、概述 在Valgrind下运行的程序不是由CPU直接执行的。相反,它运行在Valgrind提供的合成CPU上。这就是调试器在Valgrind上运行时无法调试程序的原因。 二、快速入门 在使用Memcheck工具时使用GDB调试程序,启动方式如下: 1、valgrind --vgdb = yes --vgdb-error = 0 可执…

C++模式学习------工厂模式

工厂模式属于创建型模式&#xff0c;大致可以分为简单工厂模式、抽象工厂模式。 简单工厂模式&#xff0c;它的主要特点是需要在工厂类中做判断&#xff0c;从而创造相应的产品。 1 enum PTYPE2 {3 ProdA 0,4 ProdB 15 };6 7 class ProductBase8 {9 public: 10 v…

JavaScript中正则表达式学习(一)

2019独角兽企业重金招聘Python工程师标准>>> 1.判断是不是手机号码&#xff08;实际判断是不是11位数字&#xff0c;可以用\d来匹配数字&#xff09; 表单部分代码&#xff1a; <form name"form1" > <lable>请输入&#xff1a;</lable>…

深度 | 推荐系统评估

作者 | gongyouliu 来源 | 大数据工程师作者在上篇文章《推荐系统的工程实现》中提到推荐系统要很好地落地到业务中&#xff0c;需要搭建支撑模块&#xff0c;其中效果评估模块就是其中非常重要的一个。本篇文章作者来详细说明怎么评估(Evaluating)推荐系统的效果&#xff0c;…

【linux】Valgrind工具集详解(七):Memcheck(内存错误检测器)

一、概述 Memcheck是一个内存错误检测器。它可以检测C和C ++程序中常见的以下问题: 1、非法内存:如越界、释放后继续访问; 2、使用未初始化的值; 3、释放内存错误:如double-free(同一内存上执行了两次free)、或者 malloc、new、new[] 与 free、delete、delete[]错配使用…

Kafka系列三 java API操作

使用java API操作kafka 1.pom.xml <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.x…

用自己的×××身换来男朋友的健康

MASKDIY BLOG开通作 他把她当成孩子一样宠着&#xff0c;不让她工作&#xff0c;更不让她做一点点家务。他对她说&#xff1a;我就是要让你幸福&#xff0c;一点苦也不让你尝&#xff0c;等你快乐的长到二十岁&#xff0c;我就娶你&#xff0c;继续宠你养你一辈子。   他是一…

R和Python谁更好?这次让你「鱼与熊掌」兼得

作者 | Parul Pandey译者 | 大鱼责编 | Jane出品 | Python大本营&#xff08;公众号id&#xff1a;pythonnews&#xff09;如果你从事在数据科学领域&#xff0c;提到编程语言&#xff0c;一定能马上想到 R 语言和 Python语言&#xff08;以下分别简称 R、Python&#xff09;。…

大学实习就要来了,买个性价比高的笔记本应付一下

人才市场历来有着“金三银四”、“金九银十”招聘高峰期之说。“金九银十”指的是每年9、10月份&#xff0c;各大企业为第二年拓宽事务许多吸纳人才&#xff0c;一起应届高校毕业生找作业&#xff0c;供需两旺。而“金三银四”则是职场人拿到了奖金&#xff0c;看清了得失&…

【linux】Valgrind工具集详解(八):Memcheck命令行参数详解

【linux】Valgrind工具集详解(五):命令行详解中不够全,在此专门针对Memcheck工具中的命令行参数做一次详细的解释。 Memcheck命令行选项 –leak-check=<no|summary|yes|full> [default: summary] 程序执行完毕后,搜索内存泄漏。默认值为summary,只统计发生了多少…

PHP 5.3 中不建议使用的(部分)函数列表

2019独角兽企业重金招聘Python工程师标准>>> PHP 5.3.0 introduces two new error levels: E_DEPRECATED and E_USER_DEPRECATED. The E_DEPRECATED error level is used to indicate that a function or feature has been deprecated. The E_USER_DEPRECATED level…

【linux】Valgrind工具集详解(九):Memcheck检查的内容和方法

一、值的有效性 1、什么是值的有效性? 英文原文是Valid-value (V) bits,直译过来就是有效值(V)位。 我将它理解为值的有效性,就是判断在内存或CPU的物理地址中存储的数据是否有效,比如在内存中变量(int i)代表的物理位置(不是地址),没有初始化,就去使用它,是否合…

微软亚研院提出用于语义分割的结构化知识蒸馏 | CVPR 2019

作者 | CV君来源 | 我爱计算机视觉今天跟大家分享一篇关于语义分割的论文&#xff0c;刚刚上传到arXiv的CVPR 2019接收论文《Structured Knowledge Distillation for Semantic Segmentation》&#xff0c;通讯作者单位为微软亚洲研究院。作者信息&#xff1a;作者分别来自澳大利…

Elam的git笔记:(二)git的安装与基本操作介绍

Giti安装 下载地址下载&#xff1a;https://git-scm.com/download/win自动下载64位&#xff0c;如果是32位系统&#xff0c;取消下载后自行下载对应版本双击安装&#xff0c;自选项可根据自身需求自由选择 习惯于cmd的同学可以选择第二个安装完成后在桌面右键&#xff0c;选择G…

创新驱动未来,浪潮持续深耕信息安全市场

2010年&#xff0c;我国信息安全行业在快速发展中涌现出众多优秀的安全厂商&#xff0c;以创新的产品及技术推动中国信息安全产业做大做强。其中&#xff0c;浪潮创造性地开发出了英信安全服务器&#xff0c;加上此前推出的浪潮服务器安全加固系统&#xff08;&#xff09;&…

Pig变飞机?AI为什么这么蠢 | Adversarial Attack

整理 | Jane责编 | Jane出品 | AI科技大本营&#xff08;公众号id&#xff1a;rgznai100&#xff09;【编者按】这篇文章的起意有两点&#xff1a;一是由刚刚过去的 315 打假日&#xff0c;智能语音机器人在过去一年拨出的超 40 亿电话&#xff0c;联想到前一段时间引起大家热烈…

【linux】Valgrind工具集详解(十):SGCheck(检查栈和全局数组溢出)

一、概述 SGCheck是一种用于检查栈中和全局数组溢出的工具。它的工作原理是使用一种启发式方法,该方法源于对可能的堆栈形式和全局数组访问的观察。 栈中的数据:例如函数内声明数组int a[10],而不是malloc分配的,malloc分配的内存是在堆中。 SGCheck和Memcheck是互补的:它…

shell脚本之 if,case,for的用法

目录一.条件选择&#xff1a;if语句二.条件判断&#xff1a;case语句三.for循环 一.条件选择&#xff1a;if语句 单分支if 判断条件;then 条件为真的分支代码fi 例子&#xff1a;判断一个数字是否等于10 #!/bin/bashread -p 输入一个数字 numif [ $num -eq 10 ];thenecho 该数字…

RAC 修改 DB 实例名 步骤

在我之前的2篇Blog 里提到了RAC ASM实例名和 DB实例名的问题。 RAC 中 ASM 实例名 与 节点的对应关系 http://blog.csdn.net/tianlesoftware/archive/2011/03/23/6272244.aspx RAC 修改 ASM实例名 的步骤 http://blog.csdn.net/tianlesoftware/archive/2011/03/25/6275827.asp…

【linux】Valgrind工具集详解(十二):DHAT:动态堆分析器

一、概述 DHAT动态堆分析器。Massif(堆分析器)是在程序结束后输出分析结果,而DHAT是实时输出结果,所以叫做动态堆分析器。Massif只记录堆内存的申请和释放,DHAT还会分析堆空间的使用率、使用周期等信息。 DHAT的功能:它首先记录在堆上分配的块,通过分析每次内存访问时所…

微软(中国)CTO韦青:人工智能是拿来用的,不是拿来炒的

随着近几年全球各大科技巨头纷纷入场人工智能领域&#xff0c;催生了一大批技术的发展和落地&#xff1a;AI 医疗、智能翻译、图像识别、智能社交机器人、无人驾驶……这些技术的背后都离不开“深度学习”。但与此同时&#xff0c;越来越多弱点的凸显&#xff0c;也引起了公众对…

概念被滥用 你真的了解云计算吗?

在Amazon、Google和IBM这些公司推出云计算的概念之后&#xff0c;其他一些公司也开始跟进了。但遗憾的是&#xff0c;其中一部分只是打着云计算的旗号&#xff0c;实际所做的却不值得称为云。 云计算的概念越来越流行&#xff0c;但这个概念也有被人滥用的趋势。Amazon、Google…

近万个Python开源项目中精选Top34!

作者 | Mybridge编译 | 仲培艺出品 | CSDN&#xff08;ID&#xff1a;CSDNNews&#xff09;【导语】踏着人工智能、区块链的东风&#xff0c;近年来一路“横冲直撞”的 Python 在实现了从小众语言到主流的完美转身后&#xff0c;一头扎进了 2019&#xff0c;依旧没有透出丝毫停…

【linux】Valgrind工具集详解(十三):Helgrind(线程错误检测器)

一、概述 Helgrind用于检测C、C ++和Fortran程序中使用符合POSIX标准的线程函数造成的同步错误。 POSIX中关于线程的主要抽象描述有:共享公共地址空间的一组线程、线程创建、线程连接、线程退出、互斥(锁)、条件变量(线程间事件通知)、读写器锁、自旋锁、信号量和线程等…

vivado烧写bin文件到flash 中

点击 bitstream setting &#xff0c;将 bin_file 勾上&#xff0c;点击 OK。 2&#xff09;点击 generate bitstream &#xff0c;生成 bit 文件和 bin 文件 3&#xff09;点击 open hardware manager&#xff0c;连接板子。 4&#xff09;选中芯片&#xff0c;右键如下操作。…

如何使dropship第三方销售是基于发货数量,而不是基于LIV发票校验的数量

不好意思&#xff0c;我何慕雄这两天说drop ship第三方销售已经是说烂了&#xff0c;但是&#xff0c;还是要得继续说&#xff0c;毕竟这个问题也是挺复杂的。 什么是第三方销售呢&#xff1f;第三方销售是指客户向我们下销售订单&#xff0c;而我们没有货&#xff0c;但是根据…

图神经网络综述:方法及应用 | Deep Reading

整理 | 耿玉霞&#xff0c;浙江大学直博生。研究方向&#xff1a;知识图谱&#xff0c;零样本学习&#xff0c;自然语言处理等。来源 | 开放知识图谱&#xff08;公众号id&#xff1a;OpenKG-CN&#xff09;责编 | Jane近日&#xff0c;清华刘知远老师组在 arXiv 上发表了一篇关…

【linux】top命令详解

1、参数详解 $ top -helpprocps-ng version 3.3.9 Usage:top -hv | -bcHiOSs -d secs -n max -u|U user -p pid(s) -o field -w [cols]-b&#xff1a;打印所有程序 -c&#xff1a;以命令行的形式显示程序名 -d&#xff1a;设置刷新间隔时间 -h&#xff1a;显示帮助 -H&#xf…