AFNetworking讲解
#import "ViewController.h"
//#import "AFNetworking/AFNetworking.h"
#import "AFNetworking.h" @interface ViewController () {
//进度条
UIProgressView *_progressView;
} @end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad]; /*
数据请求方法
NSURLConnection 系统自带的 常用的网络请求方式
NSURLSession 系统自带的,iOS7.0版本之后出现的,它使用了Block,所以提高了开发效率
AFNetworking 第三方的 目前很多公司经常使用这个第三方,内部集成了NSURLConnection和NSURLSession 环境是ARC,也使用了Block 提高了开发效率,并且不用系统库支持
ASIHttpRequest 第三方 原来经常使用的数据请求库 缺点就是:环境需要MRC,并且没有使用Block,需要进行ARC和MRC之间的转换(混编) 优点:ASI这个第三方库已经没有开发维护,比较成熟,比较稳定,很多开发者对ASI进行了一次Block网络层封装然后调用使用。 */ /*
Get请求和Post请求
1.一般get是从服务器上获取数据,post是向服务器传送数据
2.get是把参数列表加到提交表单中的ACTION属性中,值和表单内容各个字段一一对应,在我们的URL中可以看到。POST请求是通过HTTP post机制,将表单的各个字段和其他的内容设置到Html Header里一起传送到ACTION属性指定的URL地址。(说白了用户无法看到此过程)
3.对应的get方式,传送的数据比较小,不能大于2KB.post方式传送的数据比较大,一般被默认为不受限制。但是理论上,IIS4中最大的数据量为80KB II5最大的数据量为100KB
4.get安全性非常低,post安全性非常高。但是执行效率get比post要好 建议:
get方式安全性比post差,所以建议用post方式提交数据
在做数据查询的时候,建议用get方式,而在做数据的添加、修改或删除的时候,建议post方式 易语言 汉字 大连人 */ // [self testGet]; // [self testPost]; // [self testNetState]; //创建进度条
_progressView = [[UIProgressView alloc] initWithProgressViewStyle:UIProgressViewStyleBar];
//进度条高度不会影响_progressview
_progressView.frame = CGRectMake(, , , );
_progressView.backgroundColor = [UIColor grayColor]; [self.view addSubview:_progressView]; [self testDownload]; } //5.数据下载
- (void)testDownload {
//网址
NSString *path = @"http://qiteacher.local/share/1.mp4"; //创建下载的管理者 或者说url会话管理 参数固定写默认配置参数
AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]]; //下载任务
NSURLSessionDownloadTask *downloadTask = [manager downloadTaskWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:path]] progress:^(NSProgress * _Nonnull downloadProgress) { //KVO :Key Value Obeserver 观察对象的属性 如果属性值发生了变化 会根据变化响应不同的方法
//键值观察者 //监听(观察)downloadProgress这个对象的fractionCompleted这个属性
//如果这个属性 新值和旧值不一样就会响应观察者的方法 [downloadProgress addObserver:self forKeyPath:@"fractionCompleted" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil]; } destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) {
//存放具体路径
NSString *path = [NSString stringWithFormat:@"%@/Documents/1.mp4",NSHomeDirectory()];
NSLog(@"%@",path);
//将上面拼接的沙盒路径转换成NSURL类型
return [NSURL fileURLWithPath:path]; } completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) {
//完成的Block 不管下载成功与否,都会执行到这个block里面 NSLog(@"下载结束:%@",filePath);
NSLog(@"失败信息:%@",error); //失败信息如果是空 说明下载成功 否则失败 }]; //手动开始下载
[downloadTask resume]; } //观察者执行的方法
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context { NSLog(@"%@",change); //取出进度最新的值
CGFloat value = [[change objectForKey:@"new"] floatValue]; //谨记:线程不能直接对UI进行操作否则会出现假死状态
// _progressView.progress = value; //这样写是错误 //必须在主线程或主队列中进行UI操作
//添加到主队列中 参数1是Block形式
[[NSOperationQueue mainQueue] addOperationWithBlock:^{ //在此Block里面进行UI操作 _progressView.progress = value;
}]; } //4.监测网络状态
- (void)testNetState { //网络监测管理者 注意:是单例对象
AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager]; //设置网络监测状态改变
[manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
/*
AFNetworkReachabilityStatusUnknown = -1, 未知网络
AFNetworkReachabilityStatusNotReachable = 0, 无网络
AFNetworkReachabilityStatusReachableViaWWAN = 1, 运营商网络 如2G 3G 4G 5G
AFNetworkReachabilityStatusReachableViaWiFi = 2, wifi网络
*/
switch (status) {
case AFNetworkReachabilityStatusUnknown:
{
NSLog(@"未知网络");
}
break;
case AFNetworkReachabilityStatusNotReachable:
{
NSLog(@"无网络");
}
break;
case AFNetworkReachabilityStatusReachableViaWiFi:
{
NSLog(@"wifi网络");
}
break;
case AFNetworkReachabilityStatusReachableViaWWAN:
{
NSLog(@"运营商网络");
}
break; default:
break;
}
}];
//管理者开始监测网络
[manager startMonitoring];
} //3.用post方式上传图片
- (void)testUploadImageWithPost:(NSString *)m_auth { //拿到上传头像的接口
NSString *path = @"http://10.0.8.8/sns/my/upload_headimage.php"; AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
//设置content-type
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];
//参数列表 (字典类型)
NSDictionary *paramters = @{@"m_auth":m_auth};
//用post上传图片
/*
第一个参数:接口网址路径
第二个参数:参数列表 (字典类型)
第三个参数:上传图片的block(请求体)
第四个参数:进度block
第五个参数:成功block
第六个参数:失败block
*/
[manager POST:path parameters:paramters constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData) { //这个Block是上传图片的block或者说上传正文block
//取出文件的路径(在工程中相对)如果打印是绝对路径
// NSString *imagePath = [[NSBundle mainBundle] pathForResource:@"upload" ofType:@"png"]; NSString *imagePath = [[NSBundle mainBundle] pathForResource:@"upload2" ofType:@"jpg"]; /*
第一个参数:原始图片位置的URL
第二个参数:名字:这个名字由后台提供
第三个参数:上传后文件的名字,这个名字不重要(自定义)
第四个参数:MIME类型 这里是PNG格式图片类型 image/png
第五个参数:报错信息
*/ /*
超文本标记语言文本 .html text/html
xml文档 .xml text/xml
XHTML文档 .xhtml application/xhtml+xml
普通文本 .txt text/plain
RTF文本 .rtf application/rtf
PDF文档 .pdf application/pdf
Microsoft Word文件 .word application/msword
PNG图像 .png image/png
GIF图形 .gif image/gif
JPEG图形 .jpeg,.jpg image/jpeg
au声音文件 .au audio/basic
MIDI音乐文件 mid,.midi audio/midi,audio/x-midi
RealAudio音乐文件 .ra, .ram audio/x-pn-realaudio
MPEG文件 .mpg,.mpeg video/mpeg
AVI文件 .avi video/x-msvideo
GZIP文件 .gz application/x-gzip
TAR文件 .tar application/x-tar
任意的二进制数据 application/octet-stream
*/
[formData appendPartWithFileURL:[NSURL fileURLWithPath:imagePath] name:@"headimage" fileName:@"upload2.jpg" mimeType:@"image/jpeg" error:nil]; } progress:^(NSProgress * _Nonnull uploadProgress) { NSLog(@"进度:%@",uploadProgress); } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSLog(@"上传成功"); } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"上传失败%@",error); }]; } //2.使用post请求数据
- (void)testPost {
//接口网站
NSString *path = @"http://10.0.8.8/sns/my/login.php";
//创建网络请求管理者对象
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
//网络传输类型
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
//post请求
//请求参数和get请求类同 但是第二个参数:参数列表根据接口文档而定
[manager POST:path parameters:@{@"username":@"1602qingdao1",@"password":@"woaini"} progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSLog(@"请求登录接口成功");
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:nil];
NSLog(@"%@",dic); NSLog(@"message:%@",[dic objectForKey:@"message"]); NSString *m_auth = [dic objectForKey:@"m_auth"];
//登录成功后直接上传头像
[self testUploadImageWithPost:m_auth]; } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { NSLog(@"请求登录接口失败:%@",error); }]; } //1.使用Get方法请求数据
- (void)testGet { //1.拿到网站
NSString *path = @"http://www.weather.com.cn/data/cityinfo/101010100.html"; //2.创建字一个网络请求管理者对象 (http会话管理者) 此对象不是单例对象
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
//3.设置网络传输的类型:这里一般都是二进制
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
//4.设置content-type请求头 (可选)这里表示可以接受的数据类型(text/html)MIME
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"]; //5.get请求
/*
AF的get请求方式
第一个参数:path网址路径 字符串类型
第二个参数:参数列表,这里放入nil 一般get方法都是nil
第三个参数:进度代码块 进度一般在调试的时候用到,通常状况也是nil
第四个参数:成功代码块 请求数据成功后会调用到成功代码块
第五个参数:失败代码块 请求数据失败后回调用到失败代码块 */ [manager GET:path parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { NSLog(@"成功"); NSLog(@"---%@",responseObject); //解析
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:nil];
NSLog(@"%@",dic); } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { NSLog(@"失败:%@",error); }]; } @end
AFNetworking讲解的更多相关文章
- [置顶] AFNetworking 2.0 新特性讲解之AFHTTPSessionManager
AFNetworking 2.0 相比1.0 API 接口改动还是很大的. 其中一个便是 AFURLSessionManager,当然如果你不太熟悉,或者为了兼容低版本,你依然可以选择AFHTTPRe ...
- AFNetworking 2.0 新特性讲解之AFHTTPSessionManager
AFNetworking 2.0 新特性讲解之AFHTTPSessionManager (2014-02-17 11:56:24) 转载▼ AFNetworking 2.0 相比1.0 API ...
- AFNetworking 3.1.0 使用中某些知识点讲解
# POST / GET 请求 /*! 首先要知道,POST请求不能被缓存,只有 GET 请求能被缓存.因为从数学的角度来讲,GET 的结果是 幂等 的,就好像字典里的 key 与 value 就是 ...
- 【原】AFNetworking源码阅读(六)
[原]AFNetworking源码阅读(六) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这一篇的想讲的,一个就是分析一下AFSecurityPolicy文件,看看AF ...
- 【原】AFNetworking源码阅读(四)
[原]AFNetworking源码阅读(四) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇还遗留了很多问题,包括AFURLSessionManagerTaskDe ...
- 【原】AFNetworking源码阅读(二)
[原]AFNetworking源码阅读(二) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇中我们在iOS Example代码中提到了AFHTTPSessionMa ...
- 【原】AFNetworking源码阅读(一)
[原]AFNetworking源码阅读(一) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 AFNetworking版本:3.0.4 由于我平常并没有经常使用AFNetw ...
- AFNetworking 3.0 源码解读(三)之 AFURLRequestSerialization
这篇就讲到了跟请求相关的类了 关于AFNetworking 3.0 源码解读 的文章篇幅都会很长,因为不仅仅要把代码进行详细的的解释,还会大概讲解和代码相关的知识点. 上半篇: URI编码的知识 关于 ...
- AFNetworking 3.0 源码解读(四)之 AFURLResponseSerialization
本篇是AFNetworking 3.0 源码解读的第四篇了. AFNetworking 3.0 源码解读(一)之 AFNetworkReachabilityManager AFNetworking 3 ...
随机推荐
- 解决The file “FWLifeApp” couldn’t be opened because you don’t have permission to view it.问题
The file “FWLifeApp” couldn’t be opened because you don’t have permission to view it问题是因为项目文件中的Bundl ...
- C#编程总结(十二)断点续传
C#编程总结(十二)断点续传 我们经常使用下载工具,如bit精灵.迅雷.FlashGet,这些软件都支持断点续传. 断点续传即下载任务暂停后可以继续,而无需重新下载,即下载时需要通知服务器的起始位置. ...
- 非阻塞同步算法与CAS(Compare and Swap)无锁算法
锁(lock)的代价 锁是用来做并发最简单的方式,当然其代价也是最高的.内核态的锁的时候需要操作系统进行一次上下文切换,加锁.释放锁会导致比较多的上下文切换和调度延时,等待锁的线程会被挂起直至锁释放. ...
- 数据查询语言DQL 与 内置函数(聚合函数)
数据查询语言DQL 从表中获取符合条件的数据 select select*from表的名字 查询表所有的数据.(select跟from必须一块用 成对出现的) * 表示所有字段,可以换成想要查询的 ...
- redis-desktop-manager
介绍一款Redis图形管理工具:redis-desktop-manager 下载地址:点击打开链接 我们打开redis-cl.exe 客户端,在里面添加了key= name ,value=heyang ...
- ThinkCMF变量输出+使用函数
ThinkCMF变量输出+使用函数的方式同ThinkPHP. ThinkPHP变量输出: 在模板中输出变量的方法很简单,例如,在控制器中我们给模板变量赋值: $name = 'ThinkPHP'; $ ...
- python中的argparse
argparse是python用于解析命令行参数和选项的标准模块,用于代替已经过时的optparse模块.argparse模块的作用是用于解析命令行参数. 最基础的,从一个最简单的程序开始: impo ...
- 比特币Bitcoin源代码安装编译
body{ font: 16px/1.5em 微软雅黑,arial,verdana,helvetica,sans-serif; } 比特币 (货币符号: ฿;英文名:Bitcoin;英文 ...
- Python自动化测试工具Splinter简介和使用实例
Splinter 快速介绍 官方网站:http://splinter.cobrateam.info/ 官方介绍: Splinter is an open source tool for testing ...
- [Android] WebView内的本地网页,使用XMLHttpRequest读取本地档案
[Android] WebView内的本地网页,使用XMLHttpRequest读取本地档案 问题情景 在Android里,可以使用WebView来呈现本地或是远程的网页内容.但是在显示本地网页时,如 ...