【原】iOS学习之第三方-AFNetworking1.3.0
将 CocoaPods 安装后,按照 CocoaPods 的使用说明就可以将 AFNetworking 第三方集成到工程中,具体请看上篇博客iOS学习46之第三方CocoaPods的安装和使用(通用方法)
AFNetworking简介
AFNetworking是一个 在iOS开发中 使用非常多网络开源库,是一个轻量级的网络请求API类库。
适用于iOS以及Mac OS X。它构建于在(Apple iOS开发文档) NSURLSession , NSOperation , 以及其他熟悉的Foundation技术之上,核心代码: AFHTTPSessionManager。
它拥有良好的架构,丰富的api,以及模块化构建方式,使得使用起来非常轻松。
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的更多相关文章
- 【原】iOS学习47之第三方-FMDB
将 CocoaPods 安装后,按照 CocoaPods 的使用说明就可以将 FMDB 第三方集成到工程中,具体请看博客iOS学习46之第三方CocoaPods的安装和使用(通用方法) 1. FMDB ...
- IOS学习:常用第三方库(GDataXMLNode:xml解析库)
IOS学习:常用第三方库(GDataXMLNode:xml解析库) 解析 XML 通常有两种方式,DOM 和 SAX: DOM解析XML时,读入整个XML文档并构建一个驻留内存的树结构(节点树),通过 ...
- 【原】iOS学习之事件处理的原理
在iOS学习23之事件处理中,小编详细的介绍了事件处理,在这里小编叙述一下它的相关原理 1.UITouch对象 在触摸事件的处理方法中都会有一个存放着UITouch对象的集合,这个参数有什么用呢? ( ...
- IOS学习之蓝牙4.0 BLE
IOS学习也一段时间了,该上点干货了.前段时间研究了一下IOS蓝牙通讯相关的东西,把研究的一个成果给大家分享一下. 一 项目背景 简单介绍一下做的东西,设备是一个金融刷卡器,通过蓝牙与iphone手机 ...
- 原 iOS深入学习(Block全面分析)http://my.oschina.net/leejan97/blog/268536
原 iOS深入学习(Block全面分析) 发表于1年前(2014-05-24 16:45) 阅读(26949) | 评论(14) 39人收藏此文章, 我要收藏 赞21 12月12日北京OSC源创会 ...
- 【原】iOS学习之SQLite和CoreData数据库的比较
1. SQLite数据库 sqlite数据库操作的基本流程是, 创建数据库, 再通过定义一些字段来定义表格结构, 可以利用sql语句向表格中插入记录, 删除记录, 修改记录, 表格之间也可以建立联系. ...
- iOS开发常用第三方库
UI 动画 网络相关 Model 其他 数据库 缓存处理 PDF 图像浏览及处理 摄像照相视频音频处理 响应式框架 消息相关 版本新API的Demo 代码安全与密码 测试及调试 AppleWatch ...
- iOS 学习资源
这份学习资料是为 iOS 初学者所准备的, 旨在帮助 iOS 初学者们快速找到适合自己的学习资料, 节省他们搜索资料的时间, 使他们更好的规划好自己的 iOS 学习路线, 更快的入门, 更准确的定位的 ...
- iOS学习笔记-精华整理
iOS学习笔记总结整理 一.内存管理情况 1- autorelease,当用户的代码在持续运行时,自动释放池是不会被销毁的,这段时间内用户可以安全地使用自动释放的对象.当用户的代码运行告一段 落,开始 ...
随机推荐
- Bootstrap学习(一)
Bootstrap就是对jQuery的一次再开发,所以jQuery脚本引用必须在bootstrap脚本之前. 链接:http://www.cnblogs.com/vvjiang/p/5189804.h ...
- 再来一发!DB2 应用程序如何从数据库取数据 Fetch
The FETCH statement positions a cursor on the next row of its result table and assigns the values of ...
- Loadrunner上传与下载文件脚本
一. 上传脚本 Action() { int uploadImgStatus = 0; //获取上传产品图ID web_reg_save_param_ex("ParamName=imgRan ...
- Android 5.0 如何正确启用isLoggable(一)__使用详解
转自:http://blog.csdn.net/yihongyuelan/article/details/46409389 isLoggable是什么 在Android源码中,我们经常可以看到如下代码 ...
- Webstorm & PhpStorm的序列号和证书
WebStorm注册码 User Name: EMBRACE License Key: ===== LICENSE BEGIN ===== 24718-12042010 00001h6wzKLpfo3 ...
- JavaWeb学习之tomcat安装与运行、tomcat的目录结构、配置tomcat的管理用户、web项目目录、虚拟目录、虚拟主机(1)
1.tomcat安装与运行双击tomcat目录下的bin/startup.bat,启动之后,输入http://localhost:8080,出现安装成功的提示,表示安装tomcat成功 2.tomca ...
- 重温WCF之构建一个简单的WCF(一)(2)通过Windows Service寄宿服务和WCF中实现操作重载
参考地址:http://www.cnblogs.com/zhili/p/4039111.html 一.如何在Windows Services中寄宿WCF服务 第一步:创建Windows 服务项目,具体 ...
- 在PYTHON3中,使用Asyncio来管理Event loop
#!/usr/bin/env python # -*- coding: utf-8 -*- import asyncio import datetime import time def functio ...
- oracle使用dbms_metadata包取得所有对象DDL语句
当我们想要查看某个表或者是表空间的DDL的时候,可以利用dbms_metadata.get_ddl这个包来查看. dbms_metadata包中的get_ddl函数详细参数 GET_DDL函数返回创建 ...
- HDU1294 Rooted Trees Problem(整数划分 组合数学 DP)
讲解见http://www.cnblogs.com/IMGavin/p/5621370.html, 4 可重组合 dfs枚举子树的节点个数,相乘再累加 1 #include<iostream& ...