iOS开发之ASI

本文将继续讲解网络编程,我们将使用第三方框架来实现网络编程。主要介绍两个框架:ASI 、AFN。本文主要介绍ASI。

利用ASI发送一个网络请求:同步请求、异步请求。需要向项目中导入库文件,如下:


同步请求

/**
 *  同步请求
 */
- (void)ASIsyncho {
    
    // 获取网络资源路径
    NSURL *url = [NSURL URLWithString:@"http://www.2cto.com/uploadfile/Collfiles/20140831/2014083109364172.gif"];
    // 创建请求
    
//    ASIHTTPRequest *request = [[ASIHTTPRequest alloc] initWithURL:<#(NSURL *)#>];
    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
    // 设置请求超时
    request.timeOutSeconds = 10;
    
    // 发送请求(同步)
    [request startSynchronous];
    // 该行代码过掉,才会执行下面代码
    
    // 对返回数据,进行处理
    NSError *error = [request error];
    if (error) {
        NSLog(@"请求出错---%@", error);
    }else {
        // 请求成功
        // 获取数据
        NSData *data = [request responseData];// 网络数据
        NSLog(@"data - %zd", data.length);
        int status = [request responseStatusCode];// 状态码:200 OK
        NSLog(@"status - %d", status);
    }
    
}

运行结果:

如果网络速度很慢或请求数据很大,程序将会卡在[requeststartSynchronous];

这一行,给用户不好的体验,我们基本上不使用同步的请求。

异步请求:代理方法、SEL回调、block回调

1.    代理方法

/**
 *  异步请求(代理)
 */
- (void)ASIasynchoDelegate {
    // 获取网络资源路径
    NSURL *url = [NSURL URLWithString:@"http://www.2cto.com/uploadfile/Collfiles/20140831/2014083109364172.gif"];
    // 创建请求
    
    //    ASIHTTPRequest *request = [[ASIHTTPRequest alloc] initWithURL:<#(NSURL *)#>];
    self.request = [ASIHTTPRequest requestWithURL:url];
    // 设置请求超时
    self.request.timeOutSeconds = 10;
    
    // 设置代理,遵循ASIHTTPRequestDelegate协议
    self.request.delegate = self;// ASIHTTPRequestDelegate
    
    // 发送异步请求,ASI通过代理的方式处理异步请求,请求成功、失败都会通知代理
    [self.request startAsynchronous];
}

#pragma mark - ASIHTTPRequestDelegate
/**
 *  请求开始时调用
 */
- (void)requestStarted:(ASIHTTPRequest *)request {
    NSLog(@"requestStarted----");
}


/**
 *  请求成功结束时调用
 */
- (void)requestFinished:(ASIHTTPRequest *)request {
    NSLog(@"requestFinished----");
}


/**
 *  请求出错时调用
 */
- (void)requestFailed:(ASIHTTPRequest *)request {
    NSLog(@"requestFailed----");
}


/**
 *  有数据返回时调用
 */
- (void)request:(ASIHTTPRequest *)request didReceiveData:(NSData *)data {
    NSLog(@"didReceiveData---- %zd", data.length);
}

注意:应当在控制器被销毁的时候,取消请求,如下:

- (void)dealloc {
    [self.request clearDelegatesAndCancel];
    self.request = nil;
}

运行结果:

可见协议方法request:didReceiveData:被调用的很频繁,和之前讲过的NSURLConnection很相似。

2.    SEL回调

/**
 *  异步请求(SEL回调方法)
 */
- (void)ASIasynchoSEL {
    // 获取网络资源路径
    NSURL *url = [NSURL URLWithString:@"http://www.2cto.com/uploadfile/Collfiles/20140831/2014083109364172.gif"];
    // 创建请求
    
//    ASIHTTPRequest *request = [[ASIHTTPRequest alloc] initWithURL:<#(NSURL *)#>];
    self.request = [ASIHTTPRequest requestWithURL:url];
    // 设置请求超时
    self.request.timeOutSeconds = 10;
    
    [self.request setDelegate:self];// 还需要设置代理
    // 请求成功、失败都会回调相应的方法
    // 请求开始回调
    [self.request setDidStartSelector:@selector(asynchoRequestStarted)];
    // 请求失败回调
    [self.request setDidFailSelector:@selector(asynchoRequestFailed)];
    // 请求成功结束回调
    [self.request setDidFinishSelector:@selector(asynchoRequestFinished)];
    // 接受到请求头回调
    [self.request setDidReceiveResponseHeadersSelector:@selector(asynchoRequestHeader)];
    
    
    // 发送异步请求
    [self.request startAsynchronous];
}

- (void)asynchoRequestStarted {
    NSLog(@"asynchoRequestStarted--");
}
- (void)asynchoRequestFailed {
    NSLog(@"asynchoRequestFailed--");
}
- (void)asynchoRequestFinished {
    NSLog(@"asynchoRequestFinished--");
}
- (void)asynchoRequestHeader {
    NSLog(@"-----%@", self.request.responseHeaders);
    
}
注意:上面的代理中也设置的ASIHTTPRequest对象的代理,所以也要再控制器销毁的时候,取消请求,如下:

- (void)dealloc {
    [self.request clearDelegatesAndCancel];
    self.request = nil;
}

运行结果:


3.    block回调

/**
 *  异步请求(block回调方法)
 */
- (void)ASIasynchoBlock {
    // 获取网络资源路径
    NSURL *url = [NSURL URLWithString:@"http://www.2cto.com/uploadfile/Collfiles/20140831/2014083109364172.gif"];
    // 创建请求
    
//    ASIHTTPRequest *request = [[ASIHTTPRequest alloc] initWithURL:<#(NSURL *)#>];
    self.request = [ASIHTTPRequest requestWithURL:url];
    // 设置请求超时
    self.request.timeOutSeconds = 10;
    
    __weak typeof(self) weakSelf = self;
    // 请求出错
    [self.request setStartedBlock:^{
        
        NSLog(@"setStartedBlock---");
    }];
    // 请求出错
    [self.request setFailedBlock:^{
        
        NSLog(@"setFailedBlock---");
    }];
    // 请求成功完成
    [self.request setCompletionBlock:^{
        
        NSLog(@"setCompletionBlock---");
        NSData *responseData = [weakSelf.request responseData];
        
        NSLog(@"数据--- %zd", responseData.length);
    }];
    [self.request setBytesReceivedBlock:^(unsigned long long size, unsigned long long total) {
        
        NSLog(@"setBytesReceivedBlock---size = %lld", size);
    }];
    [self.request startAsynchronous];
}

运行结果:


以上发送同步请求和异步请求都属于GET请求。还有一个小细节,发送请求后,会自动带有加载视图出现,如下:

利用ASI发送请求,我们可以获得服务器的各种响应,如下:

// 获得状态码、状态信息
@property (atomic, assign,readonly) int responseStatusCode;
@property (atomic, retain,readonly) NSString *responseStatusMessage;

// 获得响应头
@property (atomic, retain) NSDictionary *responseHeaders;

// 获得实体内容(响应体)
- (NSData *)responseData;
- (NSString *)responseString;

下面介绍一下利用ASI发送POST请求。需要包含ASIFormDataRequest.h头文件。下面简单使用一下:

- (void)ASIPOST {
    NSURL *url = [NSURL URLWithString:@""];
    // 创建请求
    ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
    
    // 设置请求体(请求参数)形如:username=shx&pwd=123456
    [request setPostValue:@"shx" forKey:@"username"];
    [request setPostValue:@"123456" forKey:@"pwd"];
    
    // 发送POST请求
//    [request startSynchronous];// 同步
    [request startAsynchronous];// 异步
    
    //输入返回的信息
    NSLog(@"response\n%@",[request responseString]);
}

下面介绍一下利用ASI进行文件下载操作,ASI进行文件下载,只需要设置文件存储路径即可。如下:

/**
 *  文件下载
 */
- (void)fileDownLoad {
    
    // 得到文件下载路径
    NSURL *url = [NSURL URLWithString:@"http://..."];
    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
    
    // 文件存储路径(将文件存储在什么地方)
    NSString *path = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
    NSString *filePath = [path stringByAppendingPathComponent:@"abc.zip"];
    
    // 设置文件存储路径
    request.downloadDestinationPath = filePath;
    
    // 设置下载代理,遵循ASIProgressDelegate协议(其实只要实现了setProgress:方法,都可以成为它的代理对象,如:UIProgressView对象)
    request.downloadProgressDelegate = self;
    
    // 还可以设置是否支持断点下载
    request.allowResumeForFileDownloads = YES;
    
    // 发送请求,下载
    [request startAsynchronous];
}
#pragma mark 进度代理方法
- (void)setProgress:(float)newProgress
{
    NSLog(@"-----%f", newProgress);
}

下面是简单的文件上传功能的实现,,如下:

/**
 *  文件上传
 */
- (void)fileUpLoad {
    ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:[NSURL URLWithString:@""]];
    
    // 添加普通参数
    [request setPostValue:@"shx" forKey:@"user"];
    
    // 添加文件参数
    NSString *file = [[NSBundle mainBundle] pathForResource:@"1.png" ofType:nil];
    [request addFile:file forKey:@"file"];
    // 下面代码也可以上传1.png图片
//    UIImage *image = [UIImage imageNamed:@"1.png"];
//    NSData *data = UIImagePNGRepresentation(image);
//    [request addData:data withFileName:@"test.png" andContentType:@"image/png" forKey:@"file"];// test.png是存储到本地时候的图片名
    // 发送请求,上传
    [request startAsynchronous];
}
2 种添加文件参数的方法
// 通过文件的全路径
- (void)addFile:(NSString *)filePath forKey:(NSString *)key
- (void)addFile:(NSString *)filePath withFileName:(NSString *)fileName andContentType:(NSString *)contentType forKey:(NSString *)key

// 通过文件的具体数据
- (void)addData:(id)data withFileName:(NSString *)fileName andContentType:(NSString *)contentType forKey:(NSString *)key

关于ASI网络编程注意点:

实际上ASIHTTPRequest继承自NSOperation,意味着

可以将多个ASIHTTPRequest放到NSOperationQueue中,同时管理多个请求

可以设置请求之间的依赖

… …

ASIFormDataRequest继承自ASIHTTPRequest

其他的一些用法

// 现在是否有网络请求在处理中
[ASIHTTPRequest isNetworkInUse];

// 当正在请求时,是否要在状态栏显示联网状态(转圈圈)
[ASIHTTPRequest setShouldUpdateNetworkActivityIndicator:YES];

// 当应用后台运行时,是否仍然继续处理网络请求
request.shouldContinueWhenAppEntersBackground = YES;

// 设置请求超时后重试的次数
request.numberOfTimesToRetryOnTimeout = 2; // 重试2次

ASI还提供了缓存功能。ASI只能缓存Get请求的响应数据。关于ASI的缓存策略这里不做介绍。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值