IOS-网络(ASI使用)

庞乐池
2023-12-01

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

 

 

 类似资料: