【原】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,当用户的代码在持续运行时,自动释放池是不会被销毁的,这段时间内用户可以安全地使用自动释放的对象.当用户的代码运行告一段 落,开始 ...
随机推荐
- IOS关于录音,播放实现总结
//音频录制(标准过程5,9更新) 准备:导入AVFoundation框架及头文件 1 设置会话类型,允许播放及录音AVAudioSession *audioSession = [AVAudioSes ...
- java Unicode、ISO-8859-1、GBK、UTF-8编码转换深入浅出
参考文献:搞懂ASCII, ISO8859-1, ANSI和Unicode Unicode百度文献 ISO-8859-1百度文献 注: 1.utf-8虽然是国际编码,对不同范围的字符使用不同长度的编码 ...
- Codeforces Round #324 (Div. 2) C (二分)
题目链接:http://codeforces.com/contest/734/problem/C 题意: 玩一个游戏,一开始升一级需要t秒时间,现在有a, b两种魔法,两种魔法分别有m1, m2种效果 ...
- 浅析 - 提高xib(Interface Builder)高效工作的几个小技巧
本文译自:8 Tips for working effectively with Interface Builder(需FQ)先来看看目录:介绍使view的Size与view中的Content相适应按 ...
- php PDO:数据访问抽象层
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- Delphi面向对象的可见性表示符
Delphi能通过在声明域和方法的时候用protected.private.public.published和automated指示符来对对象提供进一步的控制.使用这些关键字的语法如下 TSomeOb ...
- MSSQL数据的批量插入
一.概述: 对于数据的批量插入操作似乎成了某些大数据量操作的必用手段,MSSQL也提供了一些数据批量插入的操作方法,先将这些方法汇总,以便于下次用到使用.面对数据的批量插入操作,我们也应该考虑一个问题 ...
- 运用ASMIOSTAT脚本监控asm disk磁盘性能
1,脚本作用: 类似于OS的iostat检查磁盘的I/O性能,ASMIOSTAT 脚本用来检查ASM磁盘的性能, 2,下载AMSIOSTAT脚本http://files.cnblogs.com/fil ...
- 【leetcode】Remove Duplicates from Sorted Array
题目描述: Given a sorted array, remove the duplicates in place such that each element appear only once a ...
- Ubuntu下Chromium for Android 源码的编译
转自:http://blog.csdn.net/leer168/article/details/9146689 一.环境Ubuntu10.4.4 -desktop-amd64 + VMware Wor ...