A.AFN基本知识
1.概念
  • AFNetworking
  • 是对NSURLConnection的封装
  • 运行效率没有ASI高(因为ASI基于CFNetwork),但是使用简单
  • AFN支持ARC
 
 
B.基本请求使用
1.基本使用
(1)头文件 AFNetworking.h
(2)管理者类:AFHTTPRequestOperationManager
(3)“GET”方法发送GET请求,使用“POST”方法发送POST请求
(4)使用字典发送参数
(5)block处理请求成功/失败
 
 /** 发送 GET/POST 请求 */
- (void) sendNormalRequest {
// 1.创建请求 管理者
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; // 2.设置参数
NSMutableDictionary *param = [NSMutableDictionary dictionary];
param[@"user"] = @"tom";
param[@"password"] = @""; // 3.发送请求
// // 3.1 GET请求
// [manager GET:@"http://192.168.0.21:8080/MyTestServer/login" parameters:param success:^(AFHTTPRequestOperation *operation, id responseObject) {
// NSLog(@"请求成功");
// NSLog(@"%@", responseObject);
// } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
// NSLog(@"请求失败");
// NSLog(@"%@", error);
// }]; // 3.2 POST请求
[manager POST:@"http://192.168.0.21:8080/MyTestServer/login" parameters:param success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"请求成功");
NSLog(@"%@", responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"请求失败");
NSLog(@"%@", error);
}];
}
 
2.为了方便查看服务器返回的中文数据,给数组和字典增加一个分类,支持中文
 #import <Foundation/Foundation.h>

 @implementation NSDictionary (Log)

 /** 本地化显示 */
- (NSString *)descriptionWithLocale:(id)locale {
NSMutableString *str = [NSMutableString string]; [str appendString:@"{\n"]; // 遍历字典
[self enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
[str appendFormat:@"\t%@ = %@,\n", key, obj];
}]; [str appendString:@"}"]; // 取出最后一个“,”
NSRange range = [str rangeOfString:@"," options:NSBackwardsSearch];
[str deleteCharactersInRange:range]; return str;
} @end @implementation NSArray (Log) - (NSString *)descriptionWithLocale:(id)locale {
NSMutableString *str = [NSMutableString string]; [str appendString:@"[\n"]; // 遍历数组所有元素
[self enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
[str appendFormat:@"%@, \n", obj];
}]; [str appendString:@"]"]; return str;
} @end
 
 
3.解析返回的json数据
  • AFHTTPRequestOperationManager 依靠设置序列化器来自动识别、解析返回的数据
  • 默认使用的就是json解析,可以不用设置序列化器
  • 会把json自动转换成为字典或者数组输出
 /** 返回json数据 */
- (void) getJson {
// 1.创建请求 管理者
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; // 设置序列化器
// [manager setResponseSerializer:[AFJSONResponseSerializer serializer]];//默认 // 2.设置参数
NSMutableDictionary *param = [NSMutableDictionary dictionary];
param[@"type"] = @"json"; // 3.发送请求
[manager GET:@"http://192.168.0.21:8080/MyTestServer/video" parameters:param success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"请求成功");
NSLog(@"返回的数据类型是:%@", [responseObject class]);
NSLog(@"%@", responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"请求失败");
NSLog(@"%@", error);
}];
}
 
output:
2015-01-30 03:34:14.817 AFNBasicDemo[1889:192783] 请求成功
2015-01-30 03:34:14.817 AFNBasicDemo[1889:192783]
 返回的数据类型是:__NSCFDictionary
2015-01-30 03:34:14.818 AFNBasicDemo[1889:192783] {
videos = [
{
name =
 驯龙高手1,
video = videos/1.MP4,
length = 16
,
image = images/[20150124-180852-0].PNG
},
...
 
 
4.解析返回的xml数据
设置使用xml序列化器,也可以自动将xml数据转换成为字典或者数组
如果不设置xml序列化器,处理返回数据会失败
 
 /** 返回xml数据 */
- (void) getXml{
// 1.创建请求 管理者
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; // 设置序列化器
[manager setResponseSerializer:[AFXMLParserResponseSerializer serializer]]; // 2.设置参数
NSMutableDictionary *param = [NSMutableDictionary dictionary];
param[@"type"] = @"xml"; // 3.发送请求
__weak typeof(self) vc = self;
[manager GET:@"http://192.168.0.21:8080/MyTestServer/video" parameters:param success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"请求成功");
NSLog(@"返回的数据类型是:%@", [responseObject class]); NSXMLParser *parser = (NSXMLParser *) responseObject;
parser.delegate = vc;
[parser parse];
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"请求失败");
NSLog(@"%@", error);
}];
}
 
 
C.文件下载/上传
1.文件下载
  • 也是简单发送请求
  • 但是没有ASI那样的监听功能
 
 - (void) downloadFile {
// 1.创建请求管理者
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; // 设置序列化器
[manager setResponseSerializer:[AFHTTPResponseSerializer serializer]]; // 使用二进制数据序列化 // 3.发送请求
[manager GET:@"http://192.168.0.21:8080/MyTestServer/images/images.zip" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) { NSLog(@"请求成功");
NSLog(@"返回的数据类型是:%@", [responseObject class]); NSString *cachePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
NSString *filePath = [cachePath stringByAppendingPathComponent:@"download.zip"];
NSData *data = (NSData *) responseObject;
[data writeToFile:filePath atomically:YES]; } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"请求失败");
NSLog(@"%@", error);
}];
}
 
 
2.文件上传
  • 使用POST请求,带formData的post方法
  • 要区分普通参数和文件参数,把文件数据放在普通参数中上传是不行的
  • 文件放在block参数中赋值
(1)把文件转换成二进制数据
(2)拼接文件参数
 
 /** 上传文件 */
- (void) uploadFile {
// 1.创建请求管理者
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; // 2.设置参数
NSMutableDictionary *param = [NSMutableDictionary dictionary];
param[@"user"] = @"uploader"; // 3.设置上传文件
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"M2.jpg" ofType:nil];
NSData *fileData = [NSData dataWithContentsOfFile:filePath]; // 4.上传文件
__weak typeof(fileData) uploadData = fileData; [manager POST:@"http://192.168.0.21:8080/MyTestServer/upload" parameters:param constructingBodyWithBlock:^(id<AFMultipartFormData> formData) { // 拼接文件数据
[formData appendPartWithFileData:uploadData name:@"uploadedFile" fileName:@"my_pic.jpg" mimeType:@"image/jpg"]; } success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"上传成功 ---- %@", responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"上传失败 ---- %@", error);
}];
}
 
 
D.网络状态监控
AFNetworkReachabilityManager
(1)创建网络监控管理者
(2)设置监控网络状态变化
(3)开启监控
(4)也可以主动去获取网络状态
 
 - (IBAction)monitorNetwork:(UIButton *)sender {
// 1.创建网络状态监控管理者
AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager]; // 2.网络状态改变事件(被动检测)
[manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
switch (status) {
case AFNetworkReachabilityStatusUnknown:
NSLog(@"转换为未知网络");
break;
case AFNetworkReachabilityStatusReachableViaWWAN:
NSLog(@"转换为手机网络");
break;
case AFNetworkReachabilityStatusReachableViaWiFi:
NSLog(@"转换为WIFI网络");
break;
case AFNetworkReachabilityStatusNotReachable:
NSLog(@"转换为没有网络");
break; default:
break;
}
}]; // 开启监控
[manager startMonitoring]; // 主动检测
if ([manager isReachable]) {
NSLog(@"现在有网络");
} else if ([manager isReachableViaWiFi]) {
NSLog(@"现在是通过wifi上网");
} else if ([manager isReachableViaWWAN]) {
NSLog(@"现在是通过手机网络上网");
} else {
NSLog(@"现在没有网络");
}
}
 

[iOS 多线程 & 网络 - 4.0] - AFN框架简单使用的更多相关文章

  1. [iOS 多线程 & 网络 - 2.0] - 发送接收 服务器信息

    A.搭建java服务器 使用eclipse.tomcat和struts2框架搭建一个简单的服务器 1.准备好合适版本的JDK.eclipse EE.tomcat.struts2 框架包 2.配置JDK ...

  2. [iOS 多线程 & 网络 - 1.0] - 多线程概述

    A.进程 什么是进程进程是指在系统中正在运行的一个应用程序 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内 比如同时打开QQ.Xcode,系统就会分别启动2个进程 通过"活 ...

  3. [iOS 多线程 & 网络 - 2.10] - ASI框架下载文件

    A.ASI框架中的下载 1.实现步骤 在实际的开发中如果要使用asi框架来下载服务器上的文件,只需要执行下面简单的几个步骤即可. (1)创建请求对象:(2)设置下载文件保存的路径:(3)发送下载文件的 ...

  4. [iOS 多线程 & 网络 - 2.9] - ASI框架

    A.ASI基本知识 1.ASI简单介绍 ASI:全称是ASIHTTPRequest,外号“HTTP终结者”,功能十分强大. ASI的实现基于底层的CFNetwork框架,因此运行效率很高. ASI的g ...

  5. [iOS 多线程 & 网络 - 2.11] - ASI框架上传文件

    A.ASI的上传功能基本使用 1.实现步骤 (1)创建请求 使用ASIFormDataRequest (2)设置上传文件路径 (3)发送请求     2.上传相册相片 UIImagePickerCon ...

  6. [iOS 多线程 & 网络 - 3.0] - 在线动画Demo

    A.需求 所有数据都从服务器下载 动画列表包含:图片.动画名标题.时长副标题 点击打开动画观看   code source: https://github.com/hellovoidworld/Vid ...

  7. iOS开发网络篇—使用ASI框架进行文件下载

    iOS开发网络篇—使用ASI框架进行文件下载 说明:本文介绍iOS网络编程中经常用到的框架ASI,如何使用该框架进行文件的下载. 一.简单介绍 代码示例: #import "YYViewCo ...

  8. AJ学IOS(55)多线程网络之图片下载框架之SDWebImage

    AJ分享,必须精品 效果: 代码: - (NSArray *)apps { if (!_apps) { NSArray *dictArray = [NSArray arrayWithContentsO ...

  9. [iOS 多线程 & 网络 - 2.3] - 解析xml

    A.XML基本知识 1.xml概念 什么是XML全称是Extensible Markup Language,译作“可扩展标记语言”跟JSON一样,也是常用的一种用于交互的数据格式一般也叫XML文档(X ...

随机推荐

  1. 1930. Ivan's Car(spfa)

    1930 简单二维 标记一下是上坡还是下坡 #include <iostream> #include<cstdio> #include<cstring> #incl ...

  2. acdream B - 郭式树 (水题 卡cin,cout, 卡LL)

    题目 输入正好是long long的最大, 但是答案超long long 所以用unsigned, 不能用cin cout否则一定超时: 不能用abs(), abs 只用于整数. unsigned   ...

  3. bzoj1486: [HNOI2009]最小圈

    二分+dfs. 这道题求图的最小环的每条边的权值的平均值μ. 这个平均值是大有用处的,求它我们就不用记录这条环到底有几条边构成. 如果我们把这个图的所有边的权值减去μ,就会出现负环. 所以二分求解. ...

  4. uva580Critical Mass

    递推.   用f[i]代表i个盒子的放法,设g[i]=2^n-f[i],代表i个盒子不满足条件的放法. 枚举第一个U所在的位置j.则方法有g[j-2]*(2^(i-j-2))种,j-1必须是L. 所以 ...

  5. poj 3469 Dual Core CPU

    题目描述:由于越来越多的计算机配置了双核CPU,TinySoft公司的首席技术官员,SetagLilb,决定升级他们的产品-SWODNIW.SWODNIW包含了N个模块,每个模块必须运行在某个CPU中 ...

  6. DataGuard相同SID物理Standby搭建

    Oracle Data Guard 是针对企业数据库的最有效和最全面的数据可用性.数据保护和灾难恢复解决方案.它提供管理.监视和自动化软件基础架构来创建和维护一个或多个同步备用数据库,从而保护数据不受 ...

  7. https实现安全传输的流程

    HTTPS简介 HTTPS其实是有两部分组成:HTTP + SSL / TLS,也就是在HTTP上又加了一层处理加密信息的模块.服务端和客户端的信息传输都会通过TLS进行加密,所以传输的数据都是加密后 ...

  8. 【大数取模】HDOJ-1134、CODEUP-1086

    1086: 大数取模   题目描述 现给你两个正整数A和B,请你计算A mod B.为了使问题简单,保证B小于100000. 输入 输入包含多组测试数据.每行输入包含两个正整数A和B.A的长度不超过1 ...

  9. 搞明白这八个问题,Linux系统就好学多了。

    正在犹豫入坑Linux学习的同学或者已经入坑的同学,经常会问到这样八个问题.今天,这些问题我都会一一解答,希望我的看法能帮助各位同学.常言道“好的开始是成功的一半”,如果你明白了以下八个问题,就能有一 ...

  10. MyBatis 物理分页

    MyBatis使用RowBounds实现的分页是逻辑分页,也就是先把数据记录全部查询出来,然在再根据offset和limit截断记录返回 为了在数据库层面上实现物理分页,又不改变原来MyBatis的函 ...