将 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. 检查C++内存泄露

    #ifdef _DEBUG #define DEBUG_CLIENTBLOCK new( _CLIENT_BLOCK, __FILE__, __LINE__) #else #define DEBUG_ ...

  2. C++面向对象基础知识

    多态是为了接口重用,封装和继承是为了代码重用 子类重新定义父类虚函数的方法叫做继承,不是重载! 一.基本概念 对于C++中经常出现的函数名称相同但是参数列表或者返回值不同的函数,主要存在三种情况: 1 ...

  3. Android View -- setTranslationX

    通过此方法使View位置发生偏移,达到margin的作用却又不改变View的getLeft()的值. 恢复方法是setTranslationX(0),而不是上一次偏移量的相反数. 不过,通过getLo ...

  4. CLR via C#(16)--泛型

    泛型就像是一个模板,常常定义一些通用的算法,具体调用时再替换成实际的数据类型,提高了代码的可重用性. 一.初识泛型 1. 简单实例 以最常用的FCL中的泛型List<T >为例: stat ...

  5. Jquery.Datatables td宽度太长的情况下,自动换行

    在 td 里面 加上 style="word-wrap:break-word;" 自动换行就好了,如果不想换行,可以将超出内容设为隐藏, overflow:hidden; whit ...

  6. C#的正则表达式

    using System; using System.Collections; using System.Collections.Generic; using System.IO; using Sys ...

  7. 理解Java中的引用传递和值传递

    关于Java传参时是引用传递还是值传递,一直是一个讨论比较多的话题,有论坛说Java中只有值传递,也有些地方说引用传递和值传递都存在,比较容易让人迷惑.关于值传递和引用传递其实需要分情况看待,今天学习 ...

  8. 【JAVA使用XPath、DOM4J解析XML文件,实现对XML文件的CRUD操作】

    一.简介 1.使用XPath可以快速精确定位指定的节点,以实现对XML文件的CRUD操作. 2.去网上下载一个“XPath帮助文档”,以便于查看语法等详细信息,最好是那种有很多实例的那种. 3.学习X ...

  9. <转>ORA-06413 连接未打开错误

    ORA-06413 Connection not open.Cause: Unable to establish connection.Action: Use diagnostic procedure ...

  10. html5 notification桌面提醒功能

    html5 notification桌面提醒功能 <!DOCTYPE html> <html lang="en"> <head> <met ...