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

付费下载

下载本文档

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

文档简介

第三方网络框架讲师:刘凡技术博客:新浪微博:课程提纲iOS网络层次结构基于iOS提供API实现上传文件和断点续传的思路基于iOS上传文件的演练常用iOS第三方网路框架简介ASIHTTPRequest(ASI)AFNetworking(AFN)另外一个常用框架SSZipArchiveASI使用演示ANF使用演示iOS网络编程层次结构示意图OS层(基于C的BSDsocket)CoreFoundation层(基于C的CFNetwork和CFNetServices)Cocoa层(NSURL,Bonjour,GameKit,WebKit)iOS网络编程层次结构概述Cocoa层:是最上层的基于OC的API,比如URL访问,NSStream,Bonjour,GameKit等,这是大多数情况下我们常用的API。Cocoa层是基于CoreFoundation实现的。CoreFoundation层:基于C语言的框架,因为直接使用socket需要更多的编程工作,所以苹果对OS层的socket进行简单的封装以简化编程任务。该层提供了CFNetwork和CFNetServices,其中CFNetwork又是基于CFStream和CFSocket。OS层:最底层的BSDsocket提供了对网络编程最大程度的控制,但是编程工作也是最多的。苹果建议我们使用CoreFoundation及以上层的API进行编程。BSD是UNIX系统中通用的网络接口,它不仅支持各种不同的网络类型,而且也是一种内部进程之间的通信机制。不使用第三方框架如何实现文件上传?iOS无法通过HTML表单来上传图片,因此想要上传图片,必须实现HTTP请求,而不能像其他语言那样通过HTML表单的POST就能上传使用POST请求实现图片上传演练Content-Type:multipart/form-data;boundary=650073Content-Length:78868650073Content-Disposition:form-data;name="file";filename=”abc.png"Content-Type:image/png图像数据650073Content-Disposition:form-data;name="submit"Submit650073--不使用第三方框架如何实现断点续传?要使用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)根据HEAD方法获取到要下载文件的总大小在磁盘上建立一个临时的缓冲文件,该文件的大小与目标文件大小一致缓冲文件中所有字节默认均为0开启多线程,分别加载不同的range头指定的数据块,待数据块加载完成后

将其分别写入对应的偏移地址5.所有数据块下载完成后,表示文件下载完成,将临时文件更名为目标文件开发的难点:在开始写入文件之前,首先要建立一个同等大小的文件文件的读写问题,在OC里默认是覆盖、追加,如果需要指定位置,需要使用SEEK方法,移动文件指针在多线程写入文件时,文件的锁定操作是一个问题为什么要选择第三方框架第三方框架把复杂的网络底层操作封装成友好的类和方法,并且加入异常处理等,从而可以:高效的与服务端API进行数据交换提高开发效率和稳定性选择第三方框架的原则是否被广泛使用尽量保证能够看懂其中的所有代码可以学习编写其中部分方法,但是不要去直接修改常用的iOS网络开发框架ASIHTTPRequest(ASI)AFNetworking(AFN)备注:2012年10月ASI停止更新,但这并不意味着ASI的应用已经停止AFNvsASIAFN:官方推荐的使用方法:为一系列相关的请求定义一个HTTPClient,共用一个BaseURL。每次请求把URL中除BaseURL的Path部分做为参数传给HTTPClient的静态方法,并注册一个Block用于回调基于NSURL,性能和稳定性略差AFN只封装了一些常用功能,满足基本需求,而直接忽略了很多扩展功能针对JSON、XML、PList和Image四种数据结构封装了各自处理器,开发者可以把处理器注册到操作队列中,直接在回调方法中获得格式化以后的数据ASI:推荐使用方法:每一个请求都由构造方法初始化一个(共享)实例,通过这个实例配置参数并发起请求。ASI最初使用delegate模式回调,在iOSSDK支持Block之后也提供了注册Block的实例方法(注:ASI的Block不易使用)基于CFNetwork,性能和稳定性略高ASI的扩展功能非常丰富ASI没有针对任何数据类型做特别封装,只是预留了各种接口和工具供开发者自行扩展AFN和ASI的选择AFN适合逻辑简单的应用,或者更适合开发资源尚不丰富的团队,因为AFN的易用性要比ASI好很多,而这样的应用(或团队)对底层网络控件的定制化要求也非常低。ASI更适合已经发展了一段时间的应用,或者开发资源相对丰富的团队,因为往往这些团队(或他们的应用)已经积累了一定的经验,无论是产品上还是技术上的。需求复杂度就是在这种时候高起来,而且底层订制的需求也越来越多,此时AFN就很难满足需求,需要牺牲一定的易用性,使用ASI作为网络底层控件。AFNetworking(AFN)下载地址

AFNetworking官网地址:

新建项目并导入ANF框架的步骤演练新建项目并导入AFN框架的步骤(1)1.将框架程序拖拽进项目2.添加iOS框架引用SystemConfiguration.frameworkMobileCoreServices.framework3.修改xxx-Prefix.pch文件#import<MobileCoreServices/MobileCoreServices.h>#import<SystemConfiguration/SystemConfiguration.h>演练(1)——检测网络连接状态AFHTTPClient*client=[AFHTTPClientclientWithBaseURL:[NSURLURLWithString:@""]];self.httpClient=client;[clientsetReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatusstatus){if(status==AFNetworkReachabilityStatusNotReachable){//NotreachableNSLog(@"无法访问网络");}else{//ReachableNSLog(@"可以访问网络");}if(status==AFNetworkReachabilityStatusReachableViaWiFi){NSLog(@"通过WIFI连接");}}];演练(2)——加载JSONNSURL*url=[NSURLURLWithString:@""];NSURLRequest*request=[NSURLRequestrequestWithURL:urlcachePolicy:NSURLRequestUseProtocolCachePolicytimeoutInterval:2.0f];AFJSONRequestOperation*op=[AFJSONRequestOperationJSONRequestOperationWithRequest:requestsuccess:^(NSURLRequest*request,NSHTTPURLResponse*response,idJSON){NSLog(@"%@",JSON);}failure:^(NSURLRequest*request,NSHTTPURLResponse*response,NSError*error,idJSON){NSLog(@"%@",JSON);}];[opstart];演练(3)——加载XMLNSURL*url=[NSURLURLWithString:@""];NSURLRequest*request=[NSURLRequestrequestWithURL:urlcachePolicy:NSURLRequestUseProtocolCachePolicytimeoutInterval:2.0f];AFXMLRequestOperation*op=[AFXMLRequestOperationXMLParserRequestOperationWithRequest:requestsuccess:^(NSURLRequest*request,NSHTTPURLResponse*response,NSXMLParser*XMLParser){[XMLParsersetDelegate:self];[XMLParserparse];}failure:^(NSURLRequest*request,NSHTTPURLResponse*response,NSError*error,NSXMLParser*XMLParser){NSLog(@"%@",error.localizedDescription);}];[opstart];演练(4)——图像异步加载[self.imageViewsetImageWithURL:[NSURLURLWithString:@""]placeholderImage:[UIImageimageNamed:@"头像1.png"]];演练(5)——上传图像AFHTTPClient*client=[[AFHTTPClientalloc]initWithBaseURL:[NSURLURLWithString:@""]];NSMutableURLRequest*request=[clientmultipartFormRequestWithMethod:@"POST"path:@"/~liufan9/itcast/upload.php"parameters:nilconstructingBodyWithBlock:^(id<AFMultipartFormData>formData){[formDataappendPartWithFileData:imageDataname:@"file"fileName:@"update.png"mimeType:@"image/png"];}];//定义操作AFHTTPRequestOperation*operation=[[AFHTTPRequestOperationalloc]initWithRequest:request];[operationsetUploadProgressBlock:^(NSUIntegerbytesWritten,longlongtotalBytesWritten,longlongtotalBytesExpectedToWrite){[gressViewsetProgress:(totalBytesWritten/totalBytesExpectedToWrite)];}];[operationpletionBlockWithSuccess:^(AFHTTPRequestOperation*operation,idresponseObject){}failure:^(AFHTTPRequestOperation*operation,NSError*error){NSLog(@"%@",error.localizedDescription);}];[operationstart];演练(6)——断点续传目标:使用断点续传的方式下载zip文件并解压缩思路:指定下载文件地址设定文件保存路径创建NSURLRequest创建AFHTTPRequestOperation设置操作的输出流(在网络中的数据是以流的方式传输的)设置下载进程处理块代码操作完成块代码启动操作AFN下载文件的准备工作——源、目标、请求//1.指定下载文件地址NSString*urlString=@"";NSURL*url=[NSURLURLWithString:urlString];//2.设定文件保存路径NSArray*documents=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);NSString*downloadPath=[documents[0]ponent:@"book.zip"];//3.创建NSURLRequestNSURLRequest*request=[NSURLRequestrequestWithURL:url];AFN断点续传——创建操作并设置输出流//4.创建AFURLConnectionOperationAFHTTPRequestOperation

*operation=[[AFHTTPRequestOperation

alloc]initWithRequest:request];//5.设置操作的输出流(在网络中的数据是以流的方式传输的)[operationsetOutputStream:[NSOutputStream

outputStreamToFileAtPath:downloadPathappend:NO]];AFN断点续传——下载进程处理//6.设置下载进程处理块代码//三个参数//6.1当前读的字节数//6.2已经读的字节数//6.3文件总字节数[operationsetDownloadProgressBlock:^(NSUIntegerbytesRead,long

longtotalBytesRead,long

longtotalBytesExpectedToRead){NSLog(@"%d%lld%lld",bytesRead,totalBytesRead,totalBytesExpectedToRead);NSLog(@"下载百分比:%f",(float)totalBytesRead/totalBytesExpectedToRead);}];解压缩——另一个第三方框架SSZipArchive下载地址:注意:需要引入libz.dylib框架//UnzippingNSString*zipPath=@"path_to_your_zip_file";NSString*destinationPath=@"path_to_the_folder_where_you_want_it_unzipped";[SSZipArchiveunzipFileAtPath:zipPathtoDestination:destinationPath];//ZippingNSString*zippedPath=@"path_where_you_want_the_file_created";NSArray*inputPaths=[NSArrayarrayWithObjects:[[NSBundlemainBundle]pathForResource:@"photo1"ofType:@"jpg"],[[NSBundlemainBundle]pathForResource:@"photo2"ofType:@"jpg"]nil];[SSZipArchivecreateZipFileAtPath:zippedPathwithFilesAtPaths:inputPaths];AFN框架小结简单如果需要,可以针对具体知识点去谷歌+度娘ASIHTTPRequest(ASI)下载地址

新建项目并导入ASI框架的步骤演练:从服务器下载文件并解压缩使用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'filenotfound错误原因:无法正确找到libxml/HTMLparser.h解决方法:在头文件搜索目录中添加:${SDK_DIR}/usr/include/libxml2添加搜索路径示意图新建项目并导入ASI框架的步骤(3)编译出现错误:ASITestCase.h:12:9:'GHUnitIOS/GHUnit.h'filenotfound错误原因:没有GHUnit框架解决办法:删除单元测试部分的代码引用删除单元测试代码引用示意图编译:85个错误!瞬间凌乱有木有~~~新建项目并导入ASI框架的步骤(4)新建项目并导入ASI框架的步骤(4)解决方法:添加以下iOS框架引用CFNetwork.frameworkSystemConfiguration.frameworkMobileCoreServices.frameworklibz.dyliblibxml2.dylib怎么知道需要这些框架?编译通过!!!

ASI断点续传实现思路回顾目标:使用断点续传的方式下载zip文件并解压缩思路:指定下载文件地址设定文件保存路径及缓存路径创建ASIHTTPRequest设置代理——ASI是通过代理回调的方式处理网络请求的设置下载路径设置缓存路径设置断点续传设置下载进程代理——用户想知道下载的实际进展情况启动异步请求ASI下载文件的准备工作——源和目标//1.指定下载文件地址NSString*string=@"";NSURL*url=[NSURLURLWithString:string];//2.设定文件保存路径及缓存路径NSArray*documents=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);NSString*downloadPath=[documents[0]ponent:@"book.zip"];NSString*tempPath=[documents[0]ponent:@"book.tmp"];ASI下载文件请求定义部分代码//3.创建ASIHTTPRequestASIHTTPRequest*request=[ASIHTTPRequest

requestWithURL:url];//4.设置代理——ASI是通过代理回调的方式处理网络请求的[requestsetDelegate:self];//5.设置下载路径[requestsetDownloadDestinationPath:downloadPath];//6.设置缓存路径[requestsetTemporaryFileDownloadPath:tempPath];//7.设置断点续传[requestsetAllowResumeForFileDownloads:YES];//8.设置下载进程代理[requestsetDownloadProgressDelegate:self];//9.启动异步请求——用户想知道下载的实际进展情况[requeststart];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*)requestdidReceiveResponseHeaders:(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";[SSZipArchiveunzipFileAtPath:zipPathtoDestination:destinationPath];//ZippingNSString*zippedPath=@"path_where_you_want_the_file_created";NSArray*inputPaths=[NSArrayarrayWithObjects:[[NSBundlemainBundle]pathForResource:@"photo1"ofType:@"jpg"],[[NSBundlemainBundle]pathForResource:@"photo2"ofType:@"jpg"]nil];[SSZipArchivecreateZipFileAtPath:zippedPathwithFilesAtPaths:inputPaths];请求完成部分代码实现NSLog(@"请求完成");//需求://1.知道文件保存路径(运行,发现文件已经下载完成了)//2.解压缩文件(导入SSZipArchive框架)//根据SSZipArchive框架用法写思路//2.1设置压缩文件路径NSArray*documents=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);NSString*downloadPath

温馨提示

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

评论

0/150

提交评论