#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讲解的更多相关文章

  1. [置顶] AFNetworking 2.0 新特性讲解之AFHTTPSessionManager

    AFNetworking 2.0 相比1.0 API 接口改动还是很大的. 其中一个便是 AFURLSessionManager,当然如果你不太熟悉,或者为了兼容低版本,你依然可以选择AFHTTPRe ...

  2. AFNetworking 2.0 新特性讲解之AFHTTPSessionManager

    AFNetworking 2.0 新特性讲解之AFHTTPSessionManager (2014-02-17 11:56:24) 转载▼     AFNetworking 2.0 相比1.0 API ...

  3. AFNetworking 3.1.0 使用中某些知识点讲解

    # POST / GET  请求 /*! 首先要知道,POST请求不能被缓存,只有 GET 请求能被缓存.因为从数学的角度来讲,GET 的结果是 幂等 的,就好像字典里的 key 与 value 就是 ...

  4. 【原】AFNetworking源码阅读(六)

    [原]AFNetworking源码阅读(六) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这一篇的想讲的,一个就是分析一下AFSecurityPolicy文件,看看AF ...

  5. 【原】AFNetworking源码阅读(四)

    [原]AFNetworking源码阅读(四) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇还遗留了很多问题,包括AFURLSessionManagerTaskDe ...

  6. 【原】AFNetworking源码阅读(二)

    [原]AFNetworking源码阅读(二) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇中我们在iOS Example代码中提到了AFHTTPSessionMa ...

  7. 【原】AFNetworking源码阅读(一)

    [原]AFNetworking源码阅读(一) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 AFNetworking版本:3.0.4 由于我平常并没有经常使用AFNetw ...

  8. AFNetworking 3.0 源码解读(三)之 AFURLRequestSerialization

    这篇就讲到了跟请求相关的类了 关于AFNetworking 3.0 源码解读 的文章篇幅都会很长,因为不仅仅要把代码进行详细的的解释,还会大概讲解和代码相关的知识点. 上半篇: URI编码的知识 关于 ...

  9. AFNetworking 3.0 源码解读(四)之 AFURLResponseSerialization

    本篇是AFNetworking 3.0 源码解读的第四篇了. AFNetworking 3.0 源码解读(一)之 AFNetworkReachabilityManager AFNetworking 3 ...

随机推荐

  1. 解决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 ...

  2. C#编程总结(十二)断点续传

    C#编程总结(十二)断点续传 我们经常使用下载工具,如bit精灵.迅雷.FlashGet,这些软件都支持断点续传. 断点续传即下载任务暂停后可以继续,而无需重新下载,即下载时需要通知服务器的起始位置. ...

  3. 非阻塞同步算法与CAS(Compare and Swap)无锁算法

    锁(lock)的代价 锁是用来做并发最简单的方式,当然其代价也是最高的.内核态的锁的时候需要操作系统进行一次上下文切换,加锁.释放锁会导致比较多的上下文切换和调度延时,等待锁的线程会被挂起直至锁释放. ...

  4. 数据查询语言DQL 与 内置函数(聚合函数)

    数据查询语言DQL 从表中获取符合条件的数据 select select*from表的名字   查询表所有的数据.(select跟from必须一块用 成对出现的) * 表示所有字段,可以换成想要查询的 ...

  5. redis-desktop-manager

    介绍一款Redis图形管理工具:redis-desktop-manager 下载地址:点击打开链接 我们打开redis-cl.exe 客户端,在里面添加了key= name ,value=heyang ...

  6. ThinkCMF变量输出+使用函数

    ThinkCMF变量输出+使用函数的方式同ThinkPHP. ThinkPHP变量输出: 在模板中输出变量的方法很简单,例如,在控制器中我们给模板变量赋值: $name = 'ThinkPHP'; $ ...

  7. python中的argparse

    argparse是python用于解析命令行参数和选项的标准模块,用于代替已经过时的optparse模块.argparse模块的作用是用于解析命令行参数. 最基础的,从一个最简单的程序开始: impo ...

  8. 比特币Bitcoin源代码安装编译

    body{ font: 16px/1.5em 微软雅黑,arial,verdana,helvetica,sans-serif; }        比特币 (货币符号: ฿;英文名:Bitcoin;英文 ...

  9. Python自动化测试工具Splinter简介和使用实例

    Splinter 快速介绍 官方网站:http://splinter.cobrateam.info/ 官方介绍: Splinter is an open source tool for testing ...

  10. [Android] WebView内的本地网页,使用XMLHttpRequest读取本地档案

    [Android] WebView内的本地网页,使用XMLHttpRequest读取本地档案 问题情景 在Android里,可以使用WebView来呈现本地或是远程的网页内容.但是在显示本地网页时,如 ...