ASI与AFN区别

区别:

1.底层实现

1>AFN的底层基于OC的NSURLConnection与NSURLSession

2>ASI的底层基于纯C语言的CFNetWork框架

3>ASI运行性能高于AFN

2.对服务器返回的数据处理

1>ASI没有直接提供对服务器数据的处理方式,直接放回data\string

2>AFN提供多种对服务器的数据处理方式(JSON、XML、其他)

3.监听请求过程

1>ASI提供了3套方案,每套方法都能监听请求的完整过程

a.成为代理,遵守协议,实现协议方法

b.成为代理,不遵守协议,自定义代理方法

c.设置block

2>AFN提供两个block监听请求过程(success、failure)

a.success : 请求成功时调用

b.failure : 请求失败时调用

4.提供的功能

5.文件上传下载难易度

1>ASI

a.非常容易监听下载进度和上传进度

b.容易实现断点续传

c.下载或大或小文件都可以

d.非常容易实现下载和上传

2>AFN

a.不容易监听下载进度和上传进度

b.不容易实现断点续传

c.一般用来下载不大的文件

6.ASI提供了更多的实用功能

1>控制圈圈要不要再请求过程中转

2>可以轻松设置请求之间的依赖:每个请求都是NSOperation对象

3>可以统一管理所有请求(专门提供一个ASINetworkQueue来管理所有请求对象)

4>暂停、恢复、取消所有请求

5>监听整个队列中上传、下载进度

一、ASI用法

 //
// ViewController.m
// IOS_0215_ASI
//
// Created by ma c on 16/2/15.
// Copyright © 2016年 博文科技. All rights reserved.
// #import "ViewController.h"
#import "ASIHTTPRequest.h" @interface ViewController ()<ASIHTTPRequestDelegate> @end
/*
监听ASI请求:
1>成为代理,遵守ASIHTTPRequestDelegate的协议,实现协议中的代理方法
2>成为代理,不遵守ASIHTTPRequestDelegate的协议,自定义代理方法
3>设置block
*/
@implementation ViewController - (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor cyanColor];
} - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
[self asynCustomMethod];
} #pragma mark - 其他用法 #pragma mark - 自定义方法
- (void)asynCustomMethod
{
// 1.URL
NSURL *url = [NSURL URLWithString:@"http://localhost:8080/MJServer/video"]; // 2.创建一个请求
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
request.timeOutSeconds = ; // 3.设置请求
[request startAsynchronous]; //设置监听方法
request.delegate = self;
[request setDidStartSelector:@selector(start:)];
[request setDidFinishSelector:@selector(finish:)]; } - (void)start:(ASIHTTPRequest *)request
{
NSLog(@"start------%@",request);
} - (void)finish:(ASIHTTPRequest *)request
{
NSLog(@"finish------%@",[request responseString]);
} #pragma mark - block方法
- (void)asynBlock
{
/*
如果同时设置了block和实现了代理方法,请求过程中block和代理方法都会调用
调用顺序:代理方法 > block
*/ // 1.URL
NSURL *url = [NSURL URLWithString:@"http://localhost:8080/MJServer/video"]; // 2.创建一个请求
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
request.timeOutSeconds = ; // 3.开始请求
[request startAsynchronous]; // 4.设置block监听
[request setStartedBlock:^{
NSLog(@"setStartedBlock");
}];
[request setHeadersReceivedBlock:^(NSDictionary *responseHeaders) {
NSLog(@"setHeadersReceivedBlock");
}];
[request setDataReceivedBlock:^(NSData *data) {
NSLog(@"setDataReceivedBlock---%@",data);
}];
[request setCompletionBlock:^{
NSLog(@"setCompletionBlock");
}];
[request setFailedBlock:^{
NSLog(@"setFailedBlock");
}];
}
#pragma mark - 基本用法 #pragma mark - 异步请求
/*
///异步
- (void)asynGet
{
// 1.URL
NSURL *url = [NSURL URLWithString:@"http://localhost:8080/MJServer/video"]; // 2.创建一个请求
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
request.timeOutSeconds = 15; // 3.设置代理
request.delegate = self; // 4.开始请求
[request startAsynchronous];
}
#pragma mark - ASIHTTPRequestDelegate代理方法 //1.开始发送请求
- (void)requestStarted:(ASIHTTPRequest *)request
{
NSLog(@"requestStarted");
} //2.接收到服务器的响应头信息
- (void)request:(ASIHTTPRequest *)request didReceiveResponseHeaders:(NSDictionary *)responseHeaders
{
NSLog(@"didReceiveResponseHeaders");
} //3.接收到服务器的实体数据(具体数据)
//只要实现了这个代理方法,responseData\responseString就没有值 - 建议不要使用这个方法
- (void)request:(ASIHTTPRequest *)request didReceiveData:(NSData *)data
{
NSLog(@"didReceiveData----%@",data);
} //4.服务器的相应数据 接收完毕
- (void)requestFinished:(ASIHTTPRequest *)request
{
NSLog(@"requestFinished---%@",[request responseData]);
} //5.请求失败
- (void)requestFailed:(ASIHTTPRequest *)request
{
NSLog(@"requestFailed");
}
*/ #pragma mark - 同步请求
- (void)synGet
{
// 1.URL
NSURL *url = [NSURL URLWithString:@"http://localhost:8080/MJServer/video"]; // 2.创建一个请求
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
request.timeOutSeconds = ; // 3.开始请求(这段代码会卡住,等待服务器给数据)
[request startSynchronous]; //4.请求完毕
NSError *error = [request error];
if (error) {
NSLog(@"请求失败---%@",error);
} else { //NSData *data = [request responseData];
//NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSString *str = [request responseString]; NSLog(@"请求成功---%@",str);
}
} @end

二、文件下载与上传

 //
// ViewController.m
// IOS_0215_ASI
//
// Created by ma c on 16/2/15.
// Copyright © 2016年 博文科技. All rights reserved.
// #import "ViewController.h"
#import "ASIHTTPRequest.h" //使用ASIFormDataRequest,默认发送POST请求
#import "ASIFormDataRequest.h" @interface ViewController ()<ASIProgressDelegate> @property (nonatomic, strong) ASIFormDataRequest *request; @end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor cyanColor];
} - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
// [self asynPOST];
// [self download];
[self upload];
}
#pragma mark - 文件上传
- (void)upload
{
// 1.URL
NSURL *url = [NSURL URLWithString:@"http://localhost:8080/MJServer/upload"]; // 2.创建一个请求
ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url]; // 3.设置请求参数
[request setPostValue:@"" forKey:@"username"];
[request setPostValue:@"" forKey:@"pwd"]; // 4.设置文件参数
//如果知道文件路径最好用这个-AST内部会自动识别MIMEType
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"MIMEType" ofType:@"png"];
[request setFile:filePath forKey:@"file"]; //如果文件数据是动态产生的,就用这个方法(拍照上传)
//[request setData:<#(NSData *)#> forKey:<#(NSString *)#>]; // 4.设置上传进度代理
request.uploadProgressDelegate = self; // 5.设置请求
[request startAsynchronous]; // 6.监听完毕
__weak typeof(request) weakRequest = request;
[request setCompletionBlock:^{ NSLog(@"setCompletionBlock-----%@",[weakRequest responseString]);
}]; self.request = request;
} - (void)dealloc
{
//此句代码为了防止:控制器销毁了,request还回来调用控制器的代理方法,引发野指针错误
[self.request clearDelegatesAndCancel];
} #pragma mark - 文件下载
- (void)download
{
// 1.URL
NSURL *url = [NSURL URLWithString:@"http://localhost:8080/MJServer/resources/videos/minion_01.mp4"]; // 2.创建一个请求
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
request.timeOutSeconds = ; // 3.设置文件缓存路径
NSString *caches = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
NSString *filePath = [caches stringByAppendingPathComponent:@"test.mp4"];
request.downloadDestinationPath = filePath; // 4.设置进度监听的代理(要想成为进度监听代理,最好实现ASIProgressDelegate的协议)
request.downloadProgressDelegate = self; // 4.这个属性设置为YES,就会支持断点下载
request.allowResumeForFileDownloads = YES;
// 4.如果要实现断点下载需要设置文件的临时路径
request.temporaryFileDownloadPath = [NSTemporaryDirectory() stringByAppendingPathComponent:@"test.temp"]; // 4.设置请求
[request startAsynchronous];
} - (void)setProgress:(float)newProgress
{
NSLog(@"setProgress----%lf",newProgress);
} #pragma mark - POST请求
///POST请求
- (void)asynPOST
{
// 1.URL
NSURL *url = [NSURL URLWithString:@"http://localhost:8080/MJServer/login"]; // 2.创建一个请求
ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
request.timeOutSeconds = ; // 3.设置请求参数(建议使用setPostValue)
[request setPostValue:@"" forKey:@"username"];
[request setPostValue:@"" forKey:@"pwd"]; // 4.设置请求
[request startAsynchronous]; //设置block
__weak typeof(request) weakRequest = request; [request setCompletionBlock:^{ NSLog(@"setCompletionBlock-----%@",[weakRequest responseString]);
}];
}
@end

IOS-网络(ASI使用)的更多相关文章

  1. iOS网络相关知识总结

    iOS网络相关知识总结 1.关于请求NSURLRequest? 我们经常讲的GET/POST/PUT等请求是指我们要向服务器发出的NSMutableURLRequest的类型; 我们可以设置Reque ...

  2. IOS网络请求框架AFNetworking和ASIHttpRequest对比

    ASI基于CFNetwork框架开发,而AFN基于NSURL. ASI更底层,请求使用创建CFHTTPMessageRef进行,使用NSOperationQueue进行管理,ASIHTTPReques ...

  3. 对比iOS网络组件:AFNetworking VS ASIHTTPRequest

    对比iOS网络组件:AFNetworking VS ASIHTTPRequest 作者 高嘉峻 发布于 2013年2月28日 | 7 讨论 分享到:微博微信FacebookTwitter有道云笔记邮件 ...

  4. iOS 网络监测

    iOS网络监测,监测单个页面写在ViewController里,监测全部写在AppDelegate中,而且不用终止 - (void)viewDidLoad { [super viewDidLoad]; ...

  5. iOS网络基础知识

    iOS网络基础知识 1.一次HTTP请求的完整过程 (1)浏览器或应用发起Http请求,请求包含Http请求Http(请求),地址(url),协议(Http1.1)请求为头部 (2)web服务器接收到 ...

  6. 【读书笔记】iOS网络-使用Bonjour实现自组织网络

    Bonjour就是这样一种技术:设备可以通过它轻松探测并连接到相同网络中的其他设备,整个过程只需要很少的用户参与或是根本就不需要用户参与.该框架提供了众多适合于移动的使用场景,如基于网络的游戏,设备间 ...

  7. 【读书笔记】iOS网络-使用Game Kit实现设备间通信

    Apple的Game Kit框架可以实现没有网络状况下的设备与设备之间的通信,这包括没有蜂窝服务,无法访问Wi-Fi基础设施以及无法访问局域网或Internet等情况.比如在丛林深处,高速公路上或是建 ...

  8. 【读书笔记】iOS网络-应用间通信

    一,URL方案 URL方案有3个主要用途:根据设备上其他应用的存在与否调整逻辑,切换到其他应用以及响应打开你的应用的其他应用.你还可以通过URL方案从某个站点或是在基于Web的认证流程结束是打开应用. ...

  9. 【读书笔记】iOS网络-使用推送通知

    一,本地通知 本地通知有64位的最大限制.虽然,你依然可以调度通知,不过到到达的通知数被限定为接近64个,并且按照fireDate的顺序排序,系统会忽略掉其余的通知.这意味着如果现在有64个调用的本地 ...

  10. 【读书笔记】iOS网络-测试与操纵网络流量

    一,观测网络流量. 观测网络流量的行为叫做嗅探或数据包分析. 1,嗅探硬件. 从iOS模拟器捕获数据包不需要做特别的硬件或网络配置.如果需要捕获这些数据包,那么可以使用嗅探软件来监听回送设备或是用于连 ...

随机推荐

  1. Uva10917 Walk Through the Forest

    题目链接:https://vjudge.net/problem/UVA-10917 题目意思:Jimmy下班回家要闯过一下森林,劳累一天后在森林中散步是非常惬意的事,所以他打算每天沿着一条不同的路径回 ...

  2. spring boot由浅入深(一)jdk安装

    1jdk说明 jdk是java提供了运行环境,简单的说就是给java语言制定了规则,并且提供了工具 jdk官网网站:http://www.oracle.com/technetwork/java/jav ...

  3. 获取List、Set、Map等字段的泛型参数

    测试类加单元测试方法,运行结果在注释里面: package temp; import org.junit.Test; import java.lang.reflect.Field; import ja ...

  4. day14(编码实战-用户登录注册)

    day14 案例:用户注册登录 要求:3层框架,使用验证码   功能分析 注册 登录   1.1 JSP页面 regist.jsp 注册表单:用户输入注册信息: 回显错误信息:当注册失败时,显示错误信 ...

  5. 【转】sql server 订阅发布、快照发布(一)

    原文链接:https://blog.csdn.net/tiandi_5000/article/details/11646023 SQL SERVER 2012 使用订阅发布同步数据库(一) 2013年 ...

  6. mysql 数据操作 多表查询 多表连接查询 笛卡尔积

    1 交叉连接:不适用任何匹配条件.生成笛卡尔积 所有员工都和四个部门 做了对应关系 mysql> select * from employee,department; +----+------- ...

  7. Flask系列(六)Flask实例化补充及信号

    一.实例化补充 instance_path和instance_relative_config是配合来用的. 这两个参数是用来找配置文件的,当用app.config.from_pyfile('setti ...

  8. Spark SQL的整体实现逻辑

    1.sql语句的模块解析 当我们写一个查询语句时,一般包含三个部分,select部分,from数据源部分,where限制条件部分,这三部分的内容在sql中有专门的名称: 当我们写sql时,如上图所示, ...

  9. [svc]ip地址划分

    网络界有2个计算题,一个是子网掩码,另一个就是三次握手,四次回收序列号计算了. 学会如何划分等长子网 学会如何合并网段 学会ip是否能分配 理解特殊的ip地址 ip头部 ip地址分类 现在的IP网络使 ...

  10. Android 压力测试工具Monkey

    原文地址http://www.syhm52.com/tools/17.html 一.Monkey定义探索软件测试工具有哪些,本文主要介绍Monkey工具.Monkey测试是Android平台自动化测试 ...