您的位置:首页 > 理论基础 > 计算机网络

IOS-网络(ASI使用)

2016-02-16 00:07 651 查看
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 = 15;

// 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 = 15;

// 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 = 15;

// 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:@"123" forKey:@"username"];
[request setPostValue:@"123" 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 = 15;

// 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 = 15;

// 3.设置请求参数(建议使用setPostValue)
[request setPostValue:@"123" forKey:@"username"];
[request setPostValue:@"123" forKey:@"pwd"];

// 4.设置请求
[request startAsynchronous];

//设置block
__weak typeof(request) weakRequest = request;

[request setCompletionBlock:^{

NSLog(@"setCompletionBlock-----%@",[weakRequest responseString]);
}];
}
@end
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: