将 CocoaPods 安装后,按照 CocoaPods 的使用说明就可以将 AFNetworking 第三方集成到工程中,具体请看上篇博客iOS学习46之第三方CocoaPods的安装和使用(通用方法)

AFNetworking简介

  • AFNetworking是一个 在iOS开发中 使用非常多网络开源库,是一个轻量级的网络请求API类库。

  • 适用于iOS以及Mac OS X。它构建于在(Apple iOS开发文档) NSURLSession ,  NSOperation , 以及其他熟悉的Foundation技术之上,核心代码: AFHTTPSessionManager。

  • 它拥有良好的架构,丰富的api,以及模块化构建方式,使得使用起来非常轻松。

  • 官方链接http://cocoadocs.org/docsets/AFNetworking/1.3.0/

AFHTTPSessionManager

 AFHTTPSessionManager是核心网络请求的管理类,用于管理 GET 和 POST 请求

 AFHTTPSessionManager对象的声明和懒加载代码:

#import "ViewController.h"

// 网络的请求头文件
#import <AFNetworking/AFNetworking.h> @interface ViewController () /// 用于网络请求的session对象
@property (nonatomic, strong) AFHTTPSessionManager *session; @end @implementation ViewController
// 懒加载
- (AFHTTPSessionManager *)session
{
if (!_session) {
_session = [AFHTTPSessionManager manager];
// 设置请求接口回来的时候,支持什么类型的数据
_session.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript",@"application/x-json",@"text/html", nil];
}
return _session;
} @end

AFNetworking进行网络监测

 在进行网络监测的时候,首先应该先判断网络监测是否打开,如果没有打开,先要打开监测

- (void)startMonitoring; // 打开网络监测
- (void)stopMonitoring; // 关闭网络监测

 接下来就判断当前的网络状态,AFNetworking有几种不同的网络状态

// 几种不同的网络状态
typedef NS_ENUM(NSInteger, AFNetworkReachabilityStatus) {
AFNetworkReachabilityStatusUnknown = -, // 当前网络处于未知状态,手机没有信号
AFNetworkReachabilityStatusNotReachable = , // 当前网络处于未连接状态,手机没有开流量或开WiFi
AFNetworkReachabilityStatusReachableViaWWAN = , // 手机流量网络
AFNetworkReachabilityStatusReachableViaWiFi = , // WiFi状态
};

 实例代码:

#pragma mark - 网络监测按钮的响应方法
- (IBAction)networkMonitoringAction:(UIButton *)sender
{
if (!isOPen) {
// 打开网络监测的方法
[[AFNetworkReachabilityManager sharedManager] startMonitoring];
isOPen = YES;
} else {
// 关闭网络监测
[[AFNetworkReachabilityManager sharedManager] stopMonitoring];
isOPen = NO;
} // 接下来判断当前是WiFi状态还有3g状态,网络不可用状态
[[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) { switch (status) {
case AFNetworkReachabilityStatusUnknown:
NSLog(@"当前网络处于未知状态,手机没有信号");
break; case AFNetworkReachabilityStatusNotReachable:
NSLog(@"当前网络处于未连接状态,手机没有开流量或开WiFi");
break; case AFNetworkReachabilityStatusReachableViaWWAN:
NSLog(@"手机流量网络");
break; case AFNetworkReachabilityStatusReachableViaWiFi:
NSLog(@"WiFi状态");
break; default:
break;
}
}];
}

AFNetworking的GET请求

 AFNetworking1.3.0 不再想以前一样一个 GET 请求需要很多的类参与,这里这需要一个 AFHTTPSessionManager 的方法就可以完成

 方法:

- (NSURLSessionDataTask *)GET:(NSString *)URLString // get请求的网址
parameters:(id)parameters // 拼接的参数
progress:(void (^)(NSProgress * _Nonnull))downloadProgress // 下载的进度
success:(void (^)(NSURLSessionDataTask * _Nonnull, id _Nullable))success // 请求成功
failure:(void (^)(NSURLSessionDataTask * _Nullable, NSError * _Nonnull))failure // 请求失败

 实例代码:

#pragma mark - GET请求的响应方法
- (IBAction)getRequestAction:(id)sender
{
[self.session GET:@"http://api.yhouse.com/m/city/dynmiclist" // get请求的网址
parameters:nil // 拼接的参数
progress:^(NSProgress * _Nonnull downloadProgress) { // 下载的进度
NSLog(@"下载的进度");
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { // 请求成功
NSLog(@"请求成功"); // 处理数据...
NSDictionary *reusltDict = responseObject[@"data"];
NSArray *resultArray = reusltDict[@"allCity"];
for (NSDictionary *dict in resultArray) {
NSLog(@"name = %@", dict[@"name"]);
} } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { // 请求失败
NSLog(@"请求失败");
}];
}

AFNetworking的POST请求

 同GET请求一样,POST请求也是如此,不过POST请求需要拼接参数,一般情况下参数为一个字典

 方法:

- (NSURLSessionDataTask *)POST:(NSString *)URLString // post请求的网址
parameters:(id)parameters // 拼接的参数body
progress:(void (^)(NSProgress * _Nonnull))uploadProgress // 上传的进度
success:(void (^)(NSURLSessionDataTask * _Nonnull, id _Nullable))success // 请求成功
failure:(void (^)(NSURLSessionDataTask * _Nullable, NSError * _Nonnull))failure // 请求失败

 实例代码:

#pragma mark - POST请求的响应方法
- (IBAction)postRequestAction:(id)sender
{
NSString *urlStr = @"http://m.taskwedo.com/API/wedo1/wedo.php"; NSMutableDictionary *dict = @{
@"do" : @"pri_memberlist",
@"member_id" : @"zpHr2dsRvQQxYJxo2",
@"workspace_id" : @"ILfYpE4Dhs2gWcuQx"
}.mutableCopy; [self.session POST:urlStr // post请求的网址
parameters:dict // 拼接的参数body
progress:^(NSProgress * _Nonnull uploadProgress) { // 上传的进度
NSLog(@"上传的进度");
}
success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { // 请求成功
NSLog(@"请求成功");
NSDictionary *reusltDict = responseObject[@"res"]; NSArray *keyArray = reusltDict.allKeys; for (NSString *key in keyArray) {
NSArray *resultArray = reusltDict[key];
for (NSDictionary *dict in resultArray) {
NSLog(@"username = %@", dict[@"username"]);
}
}
}
failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { // 请求失败
NSLog(@"请求失败");
}];
}

注意:URL字符串或body体中如果有特殊字符或者中文字符,AFNETWorking并没有做UTF8的转码,需要:

url = [url stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

commonContent = [commonContent stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];

代码实例:

#pragma mark - POST请求2的响应方法
- (IBAction)postRequest2Action:(id)sender
{
NSString *urlStr = @"http://m.taskwedo.com/API/wedo1/wedo.php"; NSString *commonContent = @"类模块计划用到第三部分中,待提问、回答积累到一定数量时,便于大家的问题的快速查找,所以提问部分暂时不加入这个"; commonContent = [commonContent stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]]; // 当body体或URL中出现汉字时使用 NSMutableDictionary *dict = [NSMutableDictionary dictionary];
[dict setValue:@"" forKey:@"address"];
[dict setValue:commonContent forKey:@"comment"];
[dict setValue:@"add_comment" forKey:@"do"];
[dict setValue:@"task" forKey:@"kind"];
[dict setValue:@"zpHr2dsRvQQxYJxo2" forKey:@"member_id"];
[dict setValue:@"" forKey:@"other"];
[dict setValue:@"55a47e79ec25e3641" forKey:@"task_id"]; [self.session POST:urlStr
parameters:dict
progress:^(NSProgress * _Nonnull uploadProgress) {
NSLog(@"上传成功");
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSLog(@"请求成功:%@", responseObject);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"请求失败");
}];
}

【原】iOS学习之第三方-AFNetworking1.3.0的更多相关文章

  1. 【原】iOS学习47之第三方-FMDB

    将 CocoaPods 安装后,按照 CocoaPods 的使用说明就可以将 FMDB 第三方集成到工程中,具体请看博客iOS学习46之第三方CocoaPods的安装和使用(通用方法) 1. FMDB ...

  2. IOS学习:常用第三方库(GDataXMLNode:xml解析库)

    IOS学习:常用第三方库(GDataXMLNode:xml解析库) 解析 XML 通常有两种方式,DOM 和 SAX: DOM解析XML时,读入整个XML文档并构建一个驻留内存的树结构(节点树),通过 ...

  3. 【原】iOS学习之事件处理的原理

    在iOS学习23之事件处理中,小编详细的介绍了事件处理,在这里小编叙述一下它的相关原理 1.UITouch对象 在触摸事件的处理方法中都会有一个存放着UITouch对象的集合,这个参数有什么用呢? ( ...

  4. IOS学习之蓝牙4.0 BLE

    IOS学习也一段时间了,该上点干货了.前段时间研究了一下IOS蓝牙通讯相关的东西,把研究的一个成果给大家分享一下. 一 项目背景 简单介绍一下做的东西,设备是一个金融刷卡器,通过蓝牙与iphone手机 ...

  5. 原 iOS深入学习(Block全面分析)http://my.oschina.net/leejan97/blog/268536

    原 iOS深入学习(Block全面分析) 发表于1年前(2014-05-24 16:45)   阅读(26949) | 评论(14) 39人收藏此文章, 我要收藏 赞21 12月12日北京OSC源创会 ...

  6. 【原】iOS学习之SQLite和CoreData数据库的比较

    1. SQLite数据库 sqlite数据库操作的基本流程是, 创建数据库, 再通过定义一些字段来定义表格结构, 可以利用sql语句向表格中插入记录, 删除记录, 修改记录, 表格之间也可以建立联系. ...

  7. iOS开发常用第三方库

    UI 动画 网络相关 Model 其他 数据库 缓存处理 PDF 图像浏览及处理 摄像照相视频音频处理 响应式框架 消息相关 版本新API的Demo 代码安全与密码 测试及调试 AppleWatch ...

  8. iOS 学习资源

    这份学习资料是为 iOS 初学者所准备的, 旨在帮助 iOS 初学者们快速找到适合自己的学习资料, 节省他们搜索资料的时间, 使他们更好的规划好自己的 iOS 学习路线, 更快的入门, 更准确的定位的 ...

  9. iOS学习笔记-精华整理

    iOS学习笔记总结整理 一.内存管理情况 1- autorelease,当用户的代码在持续运行时,自动释放池是不会被销毁的,这段时间内用户可以安全地使用自动释放的对象.当用户的代码运行告一段 落,开始 ...

随机推荐

  1. Mac下java开发环境的搭建与开发工具的安装

    一.安装JDK 1.根据你当前环境的需要,下载相应的JDK并安装,安装步骤与其他Mac软件安装方法相同,我安装的是jdk1.8.0_74.jdk,mac中jdk1.8的默认位置:/Library/Ja ...

  2. Swift - 状态栏颜色显示(字体、背景)

    ios上状态栏 就是指的最上面的20像素高的部分 状态栏分前后两部分,要分清这两个概念,后面会用到: 前景部分:就是指的显示电池.时间等部分: 背景部分:就是显示黑色或者图片的背景部分: 如下图:前景 ...

  3. hud 2602 Bone Collector

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2602 思路:典型的01背包 #include<stdlib.h> #include< ...

  4. 清空mysql的历史记录

    # vi ~/.mysql_history show tables; show databases; 清空里面的内容,并不用退出当前shell,就可以清除历史命令!!

  5. CLR via C#(05)- 访问限定、数据成员

    今天跟大家分享一下关于访问限定和数据成员的知识.主要包括以下两点: Abstract, sealed, virtual, new, override怎么用? Const 和 readonly好像都表示 ...

  6. Linux snmp

    http://www.cnblogs.com/amberly/p/4364072.html http://blog.csdn.net/awenluck/article/details/50220221

  7. Linux SNMP oid

    http://www.debianadmin.com/linux-snmp-oids-for-cpumemory-and-disk-statistics.html

  8. oracle一点记录

    查看数据库实例名(SERVICE_NAME): sql: select instance_name from v$instance; 如何知道oracle客户端是32位还是64的.windows下启动 ...

  9. C# 面试宝典

    1.简述 private. protected. public. internal 修饰符的访问权限. private  私有成员 只有类成员才能访问 protected  保护成员 只有该类及该类的 ...

  10. 在VS 2015中边调试边分析性能

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 对代码进行性能分析,之前往往是一种独立的Profiling过程,现在在VS 2015中可以结 ...