一、iOS网络层次结构

基于iOS提供API实现上传文件和断点续传的思路

常用iOS第三方网路框架简介

AFNetworking(AFN)

ASIHTTPRequest(ASI)

另外一个常用框架

SSZipArchive

二、iOS网络编程层次结构

Cocoa层(NSURL,Bonjour,Game Kit,WebKit)

Core Foundation层(基于 C 的 CFNetwork 和 CFNetServices)

OS层(基于 C 的 BSD socket)

三、iOS网络编程层次结构概述

Cocoa层:是最上层的基于OC的API,比如URL访问,NSStream,Bonjour,GameKit等,这是大多数情况下我们常用的 API。Cocoa层是基于Core Foundation实现的

Core Foundation层:基于C语言的框架,因为直接使用socket需要更多的编程工作,所以苹果对OS层的socket进行简单的封装以简化编程任务。该层提供了CFNetwork和CFNetServices,其中CFNetwork又是基于CFStream和CFSocket

OS层:最底层的BSD socket提供了对网络编程最大程度的控制,但是编程工作也是最多的。苹果建议我们使用Core Foundation及以上层的API进行编程。BSD是UNIX系统中通用的网络接口,它不仅支持各种不同的网络类型,而且也是一种内部进程之间的通信机制

四、AFN vs ASI

AFN:

官方推荐的使用方法:为一系列相关的请求定义一个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作为网络底层控件。

六、AFNetworking(AFN)

下载地址

https://github.com/AFNetworking/AFNetworking

AFNetworking官网地址:

http://afnetworking.com

七、导入AFN框架的步骤

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

2.  添加iOS框架引用

SystemConfiguration.framework

MobileCoreServices.framework

3. 修改xxx-Prefix.pch文件

#import <MobileCoreServices/MobileCoreServices.h>

#import <SystemConfiguration/SystemConfiguration.h>

八、AFHTTPClient

1. 建立NSURLRequest

创建GET、HEAD、PUT、DELETE方法请求

requestWithMethod:path:parameters:

创建POST方法请求

multipartFormRequestWithMethod:path:parameters: constructingBodyWithBlock:

2. 检测网路连接状态

setReachabilityStatusChangeBlock

九、AFHttpRequestOperation对NSURLConnection的封装

AFHttpRequestOperation HTTP请求操作

AFJSONRequestOperation 对JSON请求的封装

AFXMLRequestOperation 对XML请求的封装

AFPropertyListRequestOperation 对Plist请求的封装

AFImageRequestOperation 对图像请求的封装

块代码操作

setCompletionBlockWithSuccess 设置请求完成块代码

setUploadProgressBlock 设置上传进度块代码

setDownloadProgressBlock 设置下载进度块代码

下载操作需要设置outputStream

针对请求的操作pause(暂停)resume(继续)

十、检测网络连接状态

AFHTTPClient *client = [AFHTTPClient clientWithBaseURL:[NSURL URLWithString:@"http://www.baidu.com"]];

[client setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {

}];

十一、加载JSON & XML

AFJSONRequestOperation *op = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {

NSLog(@"%@", JSON);

} failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {

NSLog(@"%@", JSON);

}];

十二、上传图像

NSURLRequest *request = [client multipartFormRequestWithMethod:@"POST" path:@"/~liufan9/itcast/upload.php" parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {

[formData appendPartWithFileData:imageData name:@"file" fileName:@"update.png" mimeType:@"image/png"];

}];

// 定义操作

AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc]initWithRequest:request];

// 设置上传

// 设置下载进度

十三、解压缩——另一个第三方框架SSZipArchive

下载地址:https://github.com/samsoffes/ssziparchive

注意:需要引入libz.dylib框架

// Unzipping

NSString *zipPath = @"path_to_your_zip_file";

NSString *destinationPath = @"path_to_the_folder_where_you_want_it_unzipped";

[SSZipArchive unzipFileAtPath:zipPath toDestination:destinationPath];

// Zipping

NSString *zippedPath = @"path_where_you_want_the_file_created";

NSArray *inputPaths = [NSArray arrayWithObjects:

[[NSBundle mainBundle] pathForResource:@"photo1" ofType:@"jpg"],

[[NSBundle mainBundle] pathForResource:@"photo2" ofType:@"jpg"]

nil];

[SSZipArchive createZipFileAtPath:zippedPath withFilesAtPaths:inputPaths];

十四、ASIHTTPRequest(ASI)

使用ASI的两点注意事项

ASI框架是不支持ARC的

ASI框架是基于iOS5.0的,如果选择iOS6.0会有一些苹果官方不再维护的方法

十五、ASI下载文件的准备工作

// 1. 指定下载文件地址

NSString *string = @"http://localhost/~liufan9/itcast/download/iTunesConnect_DeveloperGuide_CN.zip";

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. 创建ASIHTTPRequest

ASIHTTPRequest *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不需要处理中间数据

但是请求开始拆分成了两部分

十九、实现代理方法之前需要先遵从代理协议

ASIHTTPRequestDelegate

ASIProgressDelegate

二十、第三方框架SSZipArchive解压缩

下载地址:https://github.com/samsoffes/ssziparchive

注意:需要引入libz.dylib框架

// Unzipping

NSString *zipPath = @"path_to_your_zip_file";

NSString *destinationPath = @"path_to_the_folder_where_you_want_it_unzipped";

[SSZipArchive unzipFileAtPath:zipPath toDestination:destinationPath];

// Zipping

NSString *zippedPath = @"path_where_you_want_the_file_created";

NSArray *inputPaths = [NSArray arrayWithObjects:

[[NSBundle mainBundle] pathForResource:@"photo1" ofType:@"jpg"],

[[NSBundle mainBundle] pathForResource:@"photo2" ofType:@"jpg"]

nil];

[SSZipArchive createZipFileAtPath:zippedPath withFilesAtPaths: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响应头部的代码实现

1. ASIRequest响应头部的代码实现

// 1. NSLOG看看头部是什么内容

NSLog(@"%@", responseHeaders);

// 2. 发现其中有一个"Content-Length" = 6105204;

// 貌似是和文件下载进度有关的工作可以在这里进行

// 将文件大小转换成M为单位 字节-K-M

_fileLength = request.contentLength / 1024.0 / 1024.0;

NSLog(@"%.2fM", _fileLength);

2. setProgress方法

NSLog(@"%.2f", newProgress * _fileLength);

iOS基础 - 第三方网络框架的更多相关文章

  1. iOS常用第三方开源框架和优秀开发者博客等

    博客收藏iOS开发过程好的开源框架.开源项目.Xcode工具插件.Mac软件.文章等,会不断更新维护,希望对你们有帮助.如果有推荐或者建议,请到此处提交推荐或者联系我. 该文档已提交GitHub,点击 ...

  2. iOS - CocoaPods 第三方开源框架管理

    1.CocoaPods CocoaPods 是一个负责管理 iOS 项目中第三方开源库的工具.CocoaPods 的项目源码在 Github 上管理.该项目开始于 2011 年 8 月 12 日,在这 ...

  3. iOS基础之网络请求相关

    1.AFNetwork二次封装方法一: #import <Foundation/Foundation.h> @interface BeeNetworkManager : NSObject ...

  4. 2016 - 1 - 25 第三方网络框架 AFN的简单使用

    AFNetworking 底层是对NSURlSession 和对 NSURLConnect 的包装 1.具体使用方法可以参照github上的主页面,在这里只是举一个文件上传的简单列子 - (void) ...

  5. ios alamofire4.x网络框架url 中文问题

    一种方式是把参数放到Parameters里面 request 增加 encoding:URLEncoding.default 就可以 还有中文在path上 比如    http://www.chao. ...

  6. Android网络框架OkHttp之get请求(源码初识)

    概括 OkHttp现在很火呀.于是上个星期就一直在学习OkHttp框架,虽然说起来已经有点晚上手了,貌似是2013年就推出了.但是现在它版本更加稳定了呀.这不,说着说着,OkHttp3.3版本在这几天 ...

  7. 史上最全的常用iOS的第三方框架

    文章来源:http://blog.csdn.net/sky_2016/article/details/45502921 图像: 1.图片浏览控件MWPhotoBrowser       实现了一个照片 ...

  8. 常用iOS的第三方框架

    图像:1.图片浏览控件MWPhotoBrowser       实现了一个照片浏览器类似 iOS 自带的相册应用,可显示来自手机的图片或者是网络图片,可自动从网络下载图片并进行缓存.可对图片进行缩放等 ...

  9. iOS开发-常用第三方开源框架介绍(你了解的ios只是冰山一角)--(转)

    图像: 1.图片浏览控件MWPhotoBrowser 实现了一个照片浏览器类似 iOS 自带的相册应用,可显示来自手机的图片或者是网络图片,可自动从网络下载图片并进行缓存.可对图片进行缩放等操作. 下 ...

随机推荐

  1. TreeMap cannot be cast to java.lang.Comparable

    /** * Constructs a new, empty tree map, using the natural ordering of its * keys. All keys inserted ...

  2. Cocos2d-x v3.0 正式版 如何创建一个项目,TestCpp执行

    欢迎增加 Cocos2d-x 交流群: 193411763 转载请注明原文出处:http://blog.csdn.net/u012945598/article/details/24456579 首先到 ...

  3. 流动python - 写port扫描仪和各种并发尝试(多线程/多进程/gevent/futures)

    port扫描仪的原理非常easy.没有什么比操作更socket,能够connect它认为,port打开. import socket def scan(port): s = socket.socket ...

  4. OOP 创建对象的7种方式

    JavaScript OOP 创建对象的7种方式   我写JS代码,可以说一直都是面向过程的写法,除了一些用来封装数据的对象或者jQuery插件,可以说对原生对象了解的是少之又少.所以我拿着<J ...

  5. Spring环境配置

    研究spring3的时候发现一个非常好用的特性:环境配置(spring2是否有此特性未知) 官方演示样例代码例如以下: <!-- app-config.xml --> <beans ...

  6. 使用PHP顶替JS有趣DOM

    較简单,我须要把一个导航页的数据整理好写入数据库.一个比較直观的方法是对html文件进行分析.通用的方法是用php的正則表達式来匹配.可是这样做开发和维护都非常困难,代码可读性非常差. 导航页的数据都 ...

  7. BZOJ 1004 HNOI2008 Cards Burnside引理

    标题效果:特定n张卡m换人,编号寻求等价类 数据保证这m换人加上置换群置换后本身构成 BZOJ坑爹0.0 条件不那么重要出来尼玛怎么做 Burnside引理--昨晚为了做这题硬啃了一晚上白书0.0 都 ...

  8. NPOI mvc easyui 根据Excel模板 生成Excel

    1.首先下载 NPOI  https://npoi.codeplex.com/releases  只要dll 就好 示例代码库太难懂了. NPOI 是一个开源  免费的 东西.而且不依赖 office ...

  9. 用javascript把扑克牌理理顺!

    打扑克的人都知道,比如斗地主! 我们一般都会按照顺序把随机摸过来的牌从小到大的顺序在手上理整齐(记得小时候打牌两副牌手都抓不过来),这篇随笔就是想通过实现这个功能来熟悉下js中排序数组等相关知识. 用 ...

  10. php 模拟POST提交的2种方法

    1.通过curl函数 $post_data = array(); $post_data['clientname'] = "test08"; $post_data['clientpa ...