iOS 多线程 & 网络 - 4.0 - AFN框架简单使用

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处理请求成功/失败

 1 /** 发送 GET/POST 请求 */
 2 - (void) sendNormalRequest {
 3     // 1.创建请求 管理者
 4     AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
 5
 6     // 2.设置参数
 7     NSMutableDictionary *param = [NSMutableDictionary dictionary];
 8     param[@"user"] = @"tom";
 9     param[@"password"] = @"123";
10
11     // 3.发送请求
12 //    // 3.1 GET请求
13 //    [manager GET:@"http://192.168.0.21:8080/MyTestServer/login" parameters:param success:^(AFHTTPRequestOperation *operation, id responseObject) {
14 //        NSLog(@"请求成功");
15 //        NSLog(@"%@", responseObject);
16 //    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
17 //        NSLog(@"请求失败");
18 //        NSLog(@"%@", error);
19 //    }];
20
21     // 3.2 POST请求
22     [manager POST:@"http://192.168.0.21:8080/MyTestServer/login" parameters:param success:^(AFHTTPRequestOperation *operation, id responseObject) {
23         NSLog(@"请求成功");
24         NSLog(@"%@", responseObject);
25     } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
26         NSLog(@"请求失败");
27         NSLog(@"%@", error);
28     }];
29 }

2.为了方便查看服务器返回的中文数据,给数组和字典增加一个分类,支持中文

 1 #import <Foundation/Foundation.h>
 2
 3 @implementation NSDictionary (Log)
 4
 5 /** 本地化显示 */
 6 - (NSString *)descriptionWithLocale:(id)locale {
 7     NSMutableString *str = [NSMutableString string];
 8
 9     [str appendString:@"{\n"];
10
11     // 遍历字典
12     [self enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
13         [str appendFormat:@"\t%@ = %@,\n", key, obj];
14     }];
15
16     [str appendString:@"}"];
17
18     // 取出最后一个“,”
19     NSRange range = [str rangeOfString:@"," options:NSBackwardsSearch];
20     [str deleteCharactersInRange:range];
21
22     return str;
23 }
24
25 @end
26
27 @implementation NSArray (Log)
28
29 - (NSString *)descriptionWithLocale:(id)locale {
30     NSMutableString *str = [NSMutableString string];
31
32     [str appendString:@"[\n"];
33
34     // 遍历数组所有元素
35     [self enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
36         [str appendFormat:@"%@, \n", obj];
37     }];
38
39     [str appendString:@"]"];
40
41     return str;
42 }
43
44 @end

3.解析返回的json数据

  • AFHTTPRequestOperationManager 依靠设置序列化器来自动识别、解析返回的数据
  • 默认使用的就是json解析,可以不用设置序列化器
  • 会把json自动转换成为字典或者数组输出
 1 /** 返回json数据 */
 2 - (void) getJson {
 3     // 1.创建请求 管理者
 4     AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
 5
 6     // 设置序列化器
 7 //    [manager setResponseSerializer:[AFJSONResponseSerializer serializer]];//默认
 8
 9     // 2.设置参数
10     NSMutableDictionary *param = [NSMutableDictionary dictionary];
11     param[@"type"] = @"json";
12
13     // 3.发送请求
14     [manager GET:@"http://192.168.0.21:8080/MyTestServer/video" parameters:param success:^(AFHTTPRequestOperation *operation, id responseObject) {
15         NSLog(@"请求成功");
16         NSLog(@"返回的数据类型是:%@", [responseObject class]);
17         NSLog(@"%@", responseObject);
18     } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
19         NSLog(@"请求失败");
20         NSLog(@"%@", error);
21     }];
22 }

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序列化器,处理返回数据会失败

 1 /** 返回xml数据 */
 2 - (void) getXml{
 3     // 1.创建请求 管理者
 4     AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
 5
 6     // 设置序列化器
 7     [manager setResponseSerializer:[AFXMLParserResponseSerializer serializer]];
 8
 9     // 2.设置参数
10     NSMutableDictionary *param = [NSMutableDictionary dictionary];
11     param[@"type"] = @"xml";
12
13
14     // 3.发送请求
15     __weak typeof(self) vc = self;
16     [manager GET:@"http://192.168.0.21:8080/MyTestServer/video" parameters:param success:^(AFHTTPRequestOperation *operation, id responseObject) {
17         NSLog(@"请求成功");
18         NSLog(@"返回的数据类型是:%@", [responseObject class]);
19
20         NSXMLParser *parser = (NSXMLParser *) responseObject;
21         parser.delegate = vc;
22         [parser parse];
23     } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
24         NSLog(@"请求失败");
25         NSLog(@"%@", error);
26     }];
27 }

C.文件下载/上传 1.文件下载

  • 也是简单发送请求
  • 但是没有ASI那样的监听功能
 1 - (void) downloadFile {
 2     // 1.创建请求管理者
 3     AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
 4
 5     // 设置序列化器
 6     [manager setResponseSerializer:[AFHTTPResponseSerializer serializer]]; // 使用二进制数据序列化
 7
 8     // 3.发送请求
 9     [manager GET:@"http://192.168.0.21:8080/MyTestServer/images/images.zip" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
10
11         NSLog(@"请求成功");
12         NSLog(@"返回的数据类型是:%@", [responseObject class]);
13
14         NSString *cachePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
15         NSString *filePath = [cachePath stringByAppendingPathComponent:@"download.zip"];
16         NSData *data = (NSData *) responseObject;
17         [data writeToFile:filePath atomically:YES];
18
19     } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
20         NSLog(@"请求失败");
21         NSLog(@"%@", error);
22     }];
23 }

2.文件上传

  • 使用POST请求,带formData的post方法
  • 要区分普通参数和文件参数,把文件数据放在普通参数中上传是不行的
  • 文件放在block参数中赋值

(1)把文件转换成二进制数据 (2)拼接文件参数

 1 /** 上传文件 */
 2 - (void) uploadFile {
 3     // 1.创建请求管理者
 4     AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
 5
 6     // 2.设置参数
 7     NSMutableDictionary *param = [NSMutableDictionary dictionary];
 8     param[@"user"] = @"uploader";
 9
10     // 3.设置上传文件
11     NSString *filePath = [[NSBundle mainBundle] pathForResource:@"M2.jpg" ofType:nil];
12     NSData *fileData = [NSData dataWithContentsOfFile:filePath];
13
14     // 4.上传文件
15     __weak typeof(fileData) uploadData = fileData;
16
17     [manager POST:@"http://192.168.0.21:8080/MyTestServer/upload" parameters:param constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
18
19         // 拼接文件数据
20         [formData appendPartWithFileData:uploadData name:@"uploadedFile" fileName:@"my_pic.jpg" mimeType:@"image/jpg"];
21
22     } success:^(AFHTTPRequestOperation *operation, id responseObject) {
23         NSLog(@"上传成功 ---- %@", responseObject);
24     } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
25         NSLog(@"上传失败 ---- %@", error);
26     }];
27 }

D.网络状态监控 AFNetworkReachabilityManager (1)创建网络监控管理者 (2)设置监控网络状态变化 (3)开启监控 (4)也可以主动去获取网络状态

 1 - (IBAction)monitorNetwork:(UIButton *)sender {
 2     // 1.创建网络状态监控管理者
 3     AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];
 4
 5     // 2.网络状态改变事件(被动检测)
 6     [manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
 7         switch (status) {
 8             case AFNetworkReachabilityStatusUnknown:
 9                 NSLog(@"转换为未知网络");
10                 break;
11             case AFNetworkReachabilityStatusReachableViaWWAN:
12                 NSLog(@"转换为手机网络");
13                 break;
14             case AFNetworkReachabilityStatusReachableViaWiFi:
15                 NSLog(@"转换为WIFI网络");
16                 break;
17             case AFNetworkReachabilityStatusNotReachable:
18                 NSLog(@"转换为没有网络");
19                 break;
20
21             default:
22                 break;
23         }
24     }];
25
26     // 开启监控
27     [manager startMonitoring];
28
29     // 主动检测
30     if ([manager isReachable]) {
31         NSLog(@"现在有网络");
32     } else if ([manager isReachableViaWiFi]) {
33         NSLog(@"现在是通过wifi上网");
34     } else if ([manager isReachableViaWWAN]) {
35         NSLog(@"现在是通过手机网络上网");
36     } else {
37         NSLog(@"现在没有网络");
38     }
39 }
时间: 2024-10-14 05:55:15

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

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

A.搭建java服务器 使用eclipse.tomcat和struts2框架搭建一个简单的服务器 1.准备好合适版本的JDK.eclipse EE.tomcat.struts2 框架包 2.配置JDK和tomcat系统变量 3.在eclipse中创建一个Dynamic Web Project, 勾选创建web.xml 4.解压一个struts2中的app范例,参考其中的web.xml和struts.xml配置 5.配置tomcat,注意配置正确的服务器的路径和发布路径,不要使用默认的eclips

[iOS 多线程 &amp; 网络 - 1.0] - 多线程概述

A.进程 什么是进程进程是指在系统中正在运行的一个应用程序 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内 比如同时打开QQ.Xcode,系统就会分别启动2个进程 通过"活动监视器"可以查看Mac系统中所开启的进程 B.线程 主线程.子线程占用内存分别是1M和512K 1.什么是线程1个进程要想执行任务,必须得有线程(每1个进程至少要有1条线程) 线程是进程的基本执行单元,一个进程(程序)的所有任务都在线程中执行 比如使用酷狗播放音乐.使用迅雷下载电影,都需要在线程中

[iOS 多线程 &amp; 网络 - 2.9] - ASI框架

A.ASI基本知识 1.ASI简单介绍 ASI:全称是ASIHTTPRequest,外号“HTTP终结者”,功能十分强大. ASI的实现基于底层的CFNetwork框架,因此运行效率很高. ASI的github地址 https://github.com/pokeb/asi-http-request ASI的使用参考http://www.cnblogs.com/dotey/archive/2011/05/10/2041966.html http://www.oschina.net/question

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

A.ASI框架中的下载 1.实现步骤 在实际的开发中如果要使用asi框架来下载服务器上的文件,只需要执行下面简单的几个步骤即可. (1)创建请求对象:(2)设置下载文件保存的路径:(3)发送下载文件的网络请求(异步).按照上面的几个步骤执行,程序会自动开启异步线程,一点一点的把数据写入到指定的文件路径,而且不论是下载多大的文件都不会占用大量的内存空间. ASI框架是基于底层的cfnoteworking的,性能很好.当然也可以设置block,或者是监听下载的进度. 自动会使用“边下边写” 使用进度

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

A.ASI的上传功能基本使用 1.实现步骤 (1)创建请求 使用ASIFormDataRequest (2)设置上传文件路径 (3)发送请求 2.上传相册相片 UIImagePickerController用来选择图片 设置图片来源,可以选择相册 使用代理 UIImagePickerControllerDelegate方法,选择完成之后取得相片 1 // 2 // ViewController.m 3 // ASIUploadDemo 4 // 5 // Created by hellovoid

[iOS 多线程 &amp; 网络 - 3.0] - 在线动画Demo

A.需求 所有数据都从服务器下载 动画列表包含:图片.动画名标题.时长副标题 点击打开动画观看 code source: https://github.com/hellovoidworld/VideoOnlineDemo server source:  https://github.com/hellovoidworld/MyOnlineVideoDemoServer B.实现 1.显示图片和基本信息 服务器端的json信息: { "videos": [ { "name&quo

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

原文  http://www.cnblogs.com/wendingding/p/3961681.html iOS开发网络篇—使用ASI框架进行文件下载 说明 :本文介绍iOS网络编程中经常用到的框架ASI,如何使用该框架进行文件的下载. 一.简单介绍 代码示例: 1 #import "YYViewController.h" 2 #import "ASIHTTPRequest.h" 3 4 @interface YYViewController () 5 6 7 @

猫猫学iOS(五十五)多线程网络之图片下载框架之SDWebImage

猫猫分享,必须精品 原创文章,欢迎转载.转载请注明:翟乃玉的博客 地址:http://blog.csdn.net/u013357243?viewmode=contents 效果: 代码: - (NSArray *)apps { if (!_apps) { NSArray *dictArray = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"apps.plist" ofType:nil

[iOS 多线程 &amp; 网络 - 2.1] - 解析json

A.iOS中json的基本使用 1.解析json数据 (1)json反序列化 对象{}格式 {key : value, key : value,...} 的键值对的结构可以反序列化为OC中的NSDictionary数组[]格式 ["java","javascript","vb",...]可以反序列化为OC中的NSArray 提示JSON的数据格式与OC中的快速包装方法非常类似JSON的数据格式同样支持嵌套 (2)json工具 从iOS 5开始,使