第三方网络框架调整_第1页
第三方网络框架调整_第2页
第三方网络框架调整_第3页
第三方网络框架调整_第4页
第三方网络框架调整_第5页
已阅读5页,还剩47页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第三方网络框架讲师:刘凡技术博客:课程提纲iOS网络层次结构基于iOS提供API实现断点续传和上传图片的思路常用iOS第三方网路框架简介ASIHTTPRequest(ASI)AFNetworking(AFN)另外一个常用框架SSZipArchiveASI使用演示AFN使用演示iOS网络编程层次结构示意图Cocoa层(NSURL,Bonjour,Game

Kit,WebKit)Core

Foundation层(基于C

的CFNetwork

和CFNetServices)OS层(基于C

的BSD

socket)iOS网络编程层次结构概述Cocoa层:是最上层的基于Objective-C的API,比如URL访问,NSStream,Bonjour,GameKit等,这是大多数情况下我们常用的

API。Cocoa层是基于Core

Foundation实现的。Core

Foundation层:因为直接使用socket需要更多的编程工作,所以苹果对OS层的socket进行简单的封装以简化编程任务。该层提供了CFNetwork和CFNetServices,其中CFNetwork又是基于CFStream和CFSocket。OS层:最底层的BSDsocket提供了对网络编程最大程度的控制,但是编程工作也是最多的。因此,苹果建议我们使用Core

Foundation及以上层的API进行编程。为什么要选择第三方框架?断点续传的思路简介不使用第三方框架如何实现断点续传?要使用NSURLConnection实现断点续传需要自定义URLRequest的头部的Range属性,通知URLConnection只是去获取部分网络内容Range头域示例Range头域可以请求实体的一个或者多个子范围。例如,表示头500个字节:bytes=0-499表示第二个500字节:bytes=500-999表示最后500个字节:bytes=-500表示500字节以后的范围:bytes=500-第一个和最后一个字节:bytes=0-0,-1同时指定几个范围:bytes=500-600,601-999但是服务器可以忽略此请求头,如果无条件GET包含Range请求头,响应会以状态码206(PartialContent)返回而不是以200(OK)通常文件上传使用的方式演示iOS无法通过HTML表单来上传图片,因此想要上传图片,必须实现HTTP请求,而不能像其他语言那样通过HTML表单的POST就能上传很遗憾参考资料:iOS通过http

post上传图片简单浏览一下IOS上传图片的方式为什么要选择第三方框架第三方框架把复杂的网络底层操作封装成友好的类和方法,并且加入异常处理等,从而可以:高效的与服务端API进行数据交换提高开发效率和稳定性选择第三方框架的原则尽量保证能够看懂其中的所有代码是否被广泛使用可以学习编写其中部分方法,但是不要去直接修改常用的iOS网络开发框架ASIHTTPRequest(ASI)AFNetworking(AFN)备注:2012年10月ASI停止更新,但这并不意味着ASI的应用已经停止AFN

vs

ASIAFN:官方推荐的使用方法:为一系列相关的请求定义一个HTTPClient,共用一个

BaseURL。每次请求把URL中除BaseURL的Path部分做为参数传给

HTTPClient的静态方法,并注册一个Block用于回调基于NSURL,性能和稳定性略差AFN只封装了一些常用功能,满足基本需求,而直接忽略了很多扩展功能针对JSON、XML、PList和Image四种数据结构封装了各自处理器,开发者可以把处理器注册到操作队列中,直接在回调方法中获得格式化以后的数据ASI:推荐使用方法:每一个请求都由构造方法初始化一个(共享)实例,通过这个实例配置参数并发起请求。ASI最初使用delegate模式回调,在iOS

SDK支持Block之后也提供了注册Block的实例方法(注:ASI的Block不易使用)基于CFNetwork,性能和稳定性略高ASI的扩展功能非常丰富ASI没有针对任何数据类型做特别封装,只是预留了各种接口和工具供开发者自行扩展AFN和ASI的选择AFN适合逻辑简单的应用,或者更适合开发资源尚不丰富的团队,因为AFN的易用性要比ASI好很多,而这样的应用(或团队)对底层网络控件的定制化要求也非常低。ASI更适合已经发展了一段时间的应用,或者开发资源相对丰富的团队,因为往往这些团队(或他们的应用)已经积累了一定的经验,无论是产品上还是技术上的。需求复杂度就是在这种时候高起来,而且底层订制的需求也越来越多,此时AFN就很难满足需求,需要牺牲一定的易用性,使用ASI作为网络底层控件。ASIHTTPRequest(ASI)下载地址新建项目并导入ASI框架的步骤演练:–从服务器下载文件并解压缩ASI下载Github项目页面:•下载最新版本地址:•使用ASI的两点注意事项ASI框架是不支持ARC的ASI框架是基于iOS5.0的,如果选择iOS6.0会有一些苹果官方不再维护的方法新建项目并导入ASI框架的步骤(1)新建项目,不选择ARC支持将Deployment

Target修改为5.0将ASI解压缩包中的以下两个文件夹拖入项目ClassesExternal新建项目并导入ASI框架的步骤(2)编译出现错误:ASIWebPageRequest.m:13:9:

'libxml/HTMLparser.h'

file

not

found错误原因:无法正确找到libxml/HTMLparser.h解决方法:在头文件搜索目录中添加:${SDK_DIR}/usr/include/libxml2添加搜索路径示意图新建项目并导入ASI框架的步骤(3)编译出现错误:ASITestCase.h:12:9:

'GHUnitIOS/GHUnit.h'

filenot

found错误原因:没有GHUnit框架解决办法:删除单元测试部分的代码引用删除单元测试代码引用示意图编译:85个错误!瞬间凌乱有木有~~~新建项目并导入ASI框架的步骤(4)新建项目并导入ASI框架的步骤(4)解决方法:添加以下iOS框架引用CFNetwork.frameworkSystemConfiguration.frameworkMobileCoreServices.frameworklibz.dyliblibxml2.dylib怎么知道需要这些框架?编译通过!!!ASI断点续传实现思路回顾目标:使用断点续传的方式下载zip文件并解压缩思路:指定下载文件地址设定文件保存路径及临时缓存路径创建ASIHTTPRequest设置代理——ASI是通过代理回调的方式处理网络请求的设置下载路径设置临时缓存路径设置断点续传设置下载进程代理——用户想知道下载的实际进展情况启动异步请求ASI下载文件的准备工作——源和目标//1.

指定下载文件地址NSString

*string

=

@"

";NSURL*url=[NSURL

URLWithString:string];//2.

设定文件保存路径及临时缓存路径NSArray

*documents

=

NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,

YES);NSString

*downloadPath

=

[documents[0]stringByAppendingPathComponent:@"book.zip"];NSString*tempPath=[documents[0]stringByAppendingPathComponent:@"book.tmp"];ASI

下载文件请求定义部分代码//3.

创建ASIHTTPRequestASIHTTPRequest

*request

=[ASIHTTPRequest

requestWithURL:url];//4.

设置代理——ASI是通过代理回调的方式处理网络请求的[request

setDelegate:self];//5.

设置下载路径[request

setDownloadDestinationPath:downloadPath];//6.

设置临时缓存路径[request

setTemporaryFileDownloadPath:tempPath];//7.

设置允许断点续传[request

setAllowResumeForFileDownloads:YES];//8.

设置下载进程代理[request

setDownloadProgressDelegate:self];//9.

启动异步请求——用户想知道下载的实际进展情况[request

start];NSURLConnectionDataDelegate的代理方法回顾//服务器开始返回数据(void)connection:didReceiveResponse://收到服务器返回的数据,本方法会被调用多次(void)connection:didReceiveData://数据接收完毕(void)connectionDidFinishLoading://网络连接错误(void)connection:didFailWithError://发送数据给服务器,POST

请求使用此方法(void)connection:didSendBodyData:totalBytesWritten:

totalBytesExpectedToWrite:ASIRequest

代理方法//请求开始(void)requestStarted:(ASIHTTPRequest

*)request//请求接收到响应的头部,包括文件大小信息(void)request:(ASIHTTPRequest

*)request

didReceiveResponseHeaders:(NSDictionary*)responseHeaders//请求完成(void)requestFinished:(ASIHTTPRequest

*)request//请求失败(void)requestFailed:(ASIHTTPRequest

*)request对比结果:ASIRequest不需要处理中间数据但是请求开始拆分成了两部分实现代理方法之前需要先遵从代理协议ASIHTTPRequestDelegateASIProgressDelegateASIRequest代理方法实现(1)给四个代理方法添加NSLog,看看都在干什么目的:运行根据Log结果写思路请求头部可以看到文件长度,思路如下://2.

发现其中有一个"Content-Length"=6105204;//貌似是和文件下载进度有关的工作可以在这里进行//暂时先放一下请求完成://需求://1.

知道文件保存路径//2.

解压缩文件//3.

删除压缩文件下一目标解压缩文件运行看看文件来了吗?解压缩——另一个第三方框架SSZipArchive下载地址:注意:需要引入libz.dylib框架//

UnzippingNSString

*zipPath

=

@"path_to_your_zip_file";NSString

*destinationPath=@"path_to_the_folder_where_you_want_it_unzipped";[SSZipArchive

unzipFileAtPath:zipPath

toDestination:destinationPath];//

ZippingNSString

*zippedPath

=

@"path_where_you_want_the_file_created";NSArray*inputPaths=[NSArrayarrayWithObjects:[[NSBundlemainBundle]pathForResource:@"photo1"ofType:@"jpg"],[[NSBundlemainBundle]pathForResource:@"photo2"ofType:@"jpg"]nil];[SSZipArchive

createZipFileAtPath:zippedPathwithFilesAtPaths:inputPaths];请求完成部分代码实现NSLog(@"请求完成");//需求://1.知道文件保存路径(运行,发现文件已经下载完成了)//2.解压缩文件(导入SSZipArchive框架)//根据SSZipArchive框架用法写思路//2.1设置压缩文件路径NSArray

*documents

=

NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);NSString

*downloadPath=

[documents[0]stringByAppendingPathComponent:@"book.zip"];//2.2设置解压缩文件路径,保存在当前路径NSString

*unzipPath

=

documents[0];//2.3解压缩[SSZipArchive

unzipFileAtPath:downloadPath

toDestination:unzipPath];//3.删除压缩文件[[NSFileManager

defaultManager]removeItemAtPath:downloadPath

error:nil];下载进度跟踪——ASIProgressDelegate下一目标ASIProgressDelegate——setProgress#pragma

mark-下载进度代理方法-

(void)setProgress:(float)newProgress{//通过Log发现传入的是一个百分比的数组//现在需要一个文件大小,并提示用户文件的大小NSLog(@"%f",

newProgress);}ASIRequest响应头部的代码实现ASIRequest响应头部的代码实现//1.

NSLOG看看头部是什么内容

NSLog(@"%@",responseHeaders);//2.

发现其中有一个"Content-Length"=6105204;//貌似是和文件下载进度有关的工作可以在这里进行//将文件大小转换成M为单位字节-K-M_fileLength

=

request.contentLength

/

1024.0

/

1024.0;NSLog(@"%.2fM",

_fileLength);setProgress方法NSLog(@"%.2f",

newProgress

*

_fileLength);ASI框架小结ASI框架是不支持ARC的ASI框架是基于iOS5.0的使用前的准备工作有点繁琐目前有不少的公司在使用ASI框架,不过大多新的项目已经转用AFN框架2012年10月ASI停止更新,但这并不意味着ASI的应用已经停止学习也是需求驱动的,知道了ASI框架的基础用法后,今后工作中如果需要,可以针对具体知识点去谷歌+度娘AFNetworking(AFN)下载地址新建项目并导入ANF框架的步骤演练:–从服务器下载文件AFN下载AFNetworking官网地址:•AFNetworking

github地址:•新建项目并导入AFN框架的步骤(1)注意:当前最新版本的AFN框架直接导入无法直接编译!解决方法:先暂时使用以前版本的AFN框架程序新建项目并导入AFN框架的步骤(2)1.

将框架程序拖拽进项目2.

添加iOS框架引用SystemConfiguration.frameworkMobileCoreServices.framework3.

修改xxx-Prefix.pch文件#import

<MobileCoreServices/MobileCoreServices.h>#import

<SystemConfiguration/SystemConfiguration.h>ASI断点续传实现思路回顾目标:使用断点续传的方式下载zip文件并解压缩思路:指定下载文件地址设定文件保存路径及缓存路径创建ASIHTTPRequest设置代理——ASI是通过代理回调的方式处理网络请求的设置下载路径设置缓存路径设置断点续传设置下载进程代理——用户想知道下载的实际进展情况启动异步请求AFN断点续传实现思路目标:使用断点续传的方式下载zip文件并解压缩思路:指定下载文件地址指定文件保存路径创建NSURLRequest创建AFURLConnectionOperation设置操作的输出流(在网络中的数据是以流的方式传输的,告诉操作把文件保存在第2步设置的路径中)设置下载进程处理块代码操作完成块代码启动操作AFN下载文件的准备工作——源、目标、请求//1.

指定下载文件地址NSString

*urlString

=

@"";NSURL*url=[NSURL

URLWithString:urlString];//2.

设定文件保存路径NSArray

*documents

=

NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,

YES);NSString

*downloadPath

=

[documents[0]stringByAppendingPathComponent:@"book.zip"];//3.

创建NSURLRequestNSURLRequest

*request

=

[NSURLRequest

requestWithURL:url];AFN断点续传——创建操作并设置输出流//4.

创建AFURLConnectionOperationAFU

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论