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用法
1 // 2 // ViewController.m 3 // IOS_0215_ASI 4 // 5 // Created by ma c on 16/2/15. 6 // Copyright © 2016年 博文科技. All rights reserved. 7 // 8 9 #import "ViewController.h" 10 #import "ASIHTTPRequest.h" 11 12 @interface ViewController ()<ASIHTTPRequestDelegate> 13 14 @end 15 /* 16 监听ASI请求: 17 1>成为代理,遵守ASIHTTPRequestDelegate的协议,实现协议中的代理方法 18 2>成为代理,不遵守ASIHTTPRequestDelegate的协议,自定义代理方法 19 3>设置block 20 */ 21 @implementation ViewController 22 23 - (void)viewDidLoad { 24 [super viewDidLoad]; 25 self.view.backgroundColor = [UIColor cyanColor]; 26 } 27 28 - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event 29 { 30 [self asynCustomMethod]; 31 } 32 33 #pragma mark - 其他用法 34 35 #pragma mark - 自定义方法 36 - (void)asynCustomMethod 37 { 38 // 1.URL 39 NSURL *url = [NSURL URLWithString:@"http://localhost:8080/MJServer/video"]; 40 41 // 2.创建一个请求 42 ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; 43 request.timeOutSeconds = 15; 44 45 // 3.设置请求 46 [request startAsynchronous]; 47 48 //设置监听方法 49 request.delegate = self; 50 [request setDidStartSelector:@selector(start:)]; 51 [request setDidFinishSelector:@selector(finish:)]; 52 53 } 54 55 - (void)start:(ASIHTTPRequest *)request 56 { 57 NSLog(@"start------%@",request); 58 } 59 60 - (void)finish:(ASIHTTPRequest *)request 61 { 62 NSLog(@"finish------%@",[request responseString]); 63 } 64 65 #pragma mark - block方法 66 - (void)asynBlock 67 { 68 /* 69 如果同时设置了block和实现了代理方法,请求过程中block和代理方法都会调用 70 调用顺序:代理方法 > block 71 */ 72 73 // 1.URL 74 NSURL *url = [NSURL URLWithString:@"http://localhost:8080/MJServer/video"]; 75 76 // 2.创建一个请求 77 ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; 78 request.timeOutSeconds = 15; 79 80 // 3.开始请求 81 [request startAsynchronous]; 82 83 // 4.设置block监听 84 [request setStartedBlock:^{ 85 NSLog(@"setStartedBlock"); 86 }]; 87 [request setHeadersReceivedBlock:^(NSDictionary *responseHeaders) { 88 NSLog(@"setHeadersReceivedBlock"); 89 }]; 90 [request setDataReceivedBlock:^(NSData *data) { 91 NSLog(@"setDataReceivedBlock---%@",data); 92 }]; 93 [request setCompletionBlock:^{ 94 NSLog(@"setCompletionBlock"); 95 }]; 96 [request setFailedBlock:^{ 97 NSLog(@"setFailedBlock"); 98 }]; 99 } 100 #pragma mark - 基本用法 101 102 #pragma mark - 异步请求 103 /* 104 ///异步 105 - (void)asynGet 106 { 107 // 1.URL 108 NSURL *url = [NSURL URLWithString:@"http://localhost:8080/MJServer/video"]; 109 110 // 2.创建一个请求 111 ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; 112 request.timeOutSeconds = 15; 113 114 // 3.设置代理 115 request.delegate = self; 116 117 // 4.开始请求 118 [request startAsynchronous]; 119 } 120 #pragma mark - ASIHTTPRequestDelegate代理方法 121 122 //1.开始发送请求 123 - (void)requestStarted:(ASIHTTPRequest *)request 124 { 125 NSLog(@"requestStarted"); 126 } 127 128 //2.接收到服务器的响应头信息 129 - (void)request:(ASIHTTPRequest *)request didReceiveResponseHeaders:(NSDictionary *)responseHeaders 130 { 131 NSLog(@"didReceiveResponseHeaders"); 132 } 133 134 //3.接收到服务器的实体数据(具体数据) 135 //只要实现了这个代理方法,responseData\responseString就没有值 - 建议不要使用这个方法 136 - (void)request:(ASIHTTPRequest *)request didReceiveData:(NSData *)data 137 { 138 NSLog(@"didReceiveData----%@",data); 139 } 140 141 //4.服务器的相应数据 接收完毕 142 - (void)requestFinished:(ASIHTTPRequest *)request 143 { 144 NSLog(@"requestFinished---%@",[request responseData]); 145 } 146 147 //5.请求失败 148 - (void)requestFailed:(ASIHTTPRequest *)request 149 { 150 NSLog(@"requestFailed"); 151 } 152 */ 153 154 #pragma mark - 同步请求 155 - (void)synGet 156 { 157 // 1.URL 158 NSURL *url = [NSURL URLWithString:@"http://localhost:8080/MJServer/video"]; 159 160 // 2.创建一个请求 161 ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; 162 request.timeOutSeconds = 15; 163 164 // 3.开始请求(这段代码会卡住,等待服务器给数据) 165 [request startSynchronous]; 166 167 //4.请求完毕 168 NSError *error = [request error]; 169 if (error) { 170 NSLog(@"请求失败---%@",error); 171 } else { 172 173 //NSData *data = [request responseData]; 174 //NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 175 NSString *str = [request responseString]; 176 177 NSLog(@"请求成功---%@",str); 178 } 179 } 180 181 @end
二、文件下载与上传
1 // 2 // ViewController.m 3 // IOS_0215_ASI 4 // 5 // Created by ma c on 16/2/15. 6 // Copyright © 2016年 博文科技. All rights reserved. 7 // 8 9 #import "ViewController.h" 10 #import "ASIHTTPRequest.h" 11 12 //使用ASIFormDataRequest,默认发送POST请求 13 #import "ASIFormDataRequest.h" 14 15 @interface ViewController ()<ASIProgressDelegate> 16 17 @property (nonatomic, strong) ASIFormDataRequest *request; 18 19 20 @end 21 22 @implementation ViewController 23 24 - (void)viewDidLoad { 25 [super viewDidLoad]; 26 self.view.backgroundColor = [UIColor cyanColor]; 27 } 28 29 - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event 30 { 31 // [self asynPOST]; 32 // [self download]; 33 [self upload]; 34 } 35 #pragma mark - 文件上传 36 - (void)upload 37 { 38 // 1.URL 39 NSURL *url = [NSURL URLWithString:@"http://localhost:8080/MJServer/upload"]; 40 41 // 2.创建一个请求 42 ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url]; 43 44 // 3.设置请求参数 45 [request setPostValue:@"123" forKey:@"username"]; 46 [request setPostValue:@"123" forKey:@"pwd"]; 47 48 // 4.设置文件参数 49 //如果知道文件路径最好用这个-AST内部会自动识别MIMEType 50 NSString *filePath = [[NSBundle mainBundle] pathForResource:@"MIMEType" ofType:@"png"]; 51 [request setFile:filePath forKey:@"file"]; 52 53 //如果文件数据是动态产生的,就用这个方法(拍照上传) 54 //[request setData:<#(NSData *)#> forKey:<#(NSString *)#>]; 55 56 // 4.设置上传进度代理 57 request.uploadProgressDelegate = self; 58 59 // 5.设置请求 60 [request startAsynchronous]; 61 62 // 6.监听完毕 63 __weak typeof(request) weakRequest = request; 64 [request setCompletionBlock:^{ 65 66 NSLog(@"setCompletionBlock-----%@",[weakRequest responseString]); 67 }]; 68 69 self.request = request; 70 } 71 72 - (void)dealloc 73 { 74 //此句代码为了防止:控制器销毁了,request还回来调用控制器的代理方法,引发野指针错误 75 [self.request clearDelegatesAndCancel]; 76 } 77 78 #pragma mark - 文件下载 79 - (void)download 80 { 81 // 1.URL 82 NSURL *url = [NSURL URLWithString:@"http://localhost:8080/MJServer/resources/videos/minion_01.mp4"]; 83 84 // 2.创建一个请求 85 ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; 86 request.timeOutSeconds = 15; 87 88 // 3.设置文件缓存路径 89 NSString *caches = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject]; 90 NSString *filePath = [caches stringByAppendingPathComponent:@"test.mp4"]; 91 request.downloadDestinationPath = filePath; 92 93 // 4.设置进度监听的代理(要想成为进度监听代理,最好实现ASIProgressDelegate的协议) 94 request.downloadProgressDelegate = self; 95 96 // 4.这个属性设置为YES,就会支持断点下载 97 request.allowResumeForFileDownloads = YES; 98 // 4.如果要实现断点下载需要设置文件的临时路径 99 request.temporaryFileDownloadPath = [NSTemporaryDirectory() stringByAppendingPathComponent:@"test.temp"]; 100 101 // 4.设置请求 102 [request startAsynchronous]; 103 } 104 105 - (void)setProgress:(float)newProgress 106 { 107 NSLog(@"setProgress----%lf",newProgress); 108 } 109 110 111 #pragma mark - POST请求 112 ///POST请求 113 - (void)asynPOST 114 { 115 // 1.URL 116 NSURL *url = [NSURL URLWithString:@"http://localhost:8080/MJServer/login"]; 117 118 // 2.创建一个请求 119 ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url]; 120 request.timeOutSeconds = 15; 121 122 // 3.设置请求参数(建议使用setPostValue) 123 [request setPostValue:@"123" forKey:@"username"]; 124 [request setPostValue:@"123" forKey:@"pwd"]; 125 126 // 4.设置请求 127 [request startAsynchronous]; 128 129 //设置block 130 __weak typeof(request) weakRequest = request; 131 132 [request setCompletionBlock:^{ 133 134 NSLog(@"setCompletionBlock-----%@",[weakRequest responseString]); 135 }]; 136 } 137 @end