ASIHTTPRequest框架使用总结系列之阿堂教程4(下载数据)

从本篇开始,阿堂准备进一步介绍ASIHTTPRequest框架下载数据和上传数据的实际应用。

为了实现多线程并发请求网络能力,ASIHTTPRequest被设计成 NSOperation的子类。ASINetworkQueue被设计成NSOpertaionQueue的子类。如果NSOpertaionQueue是线程管理器,NSOperation就相当于一个线程。它们被添加到NSOperationQueue队列中有序执行。ASINetworkQueue 和ASIHTTPRequest也有同样的概念,只是ASINetworkQueue线程管理器提供更多的与网络相关的服务,如获得下载进度等。所以,下面阿堂就主要介绍ASINetworkQueue管理请求队列的demo了。

下面,请随阿堂看一个例子介绍队列的用法。当我们点击go按钮时,从服务器端同时下载两张图片并将它们显示在界面中。

其中两个文件的完整源代码如下

ViewController.h,  ViewController.m

#import

#import "ASIHTTPRequest.h"

#import "ASINetworkQueue.h"

#import "NSNumber+Message.h"

#import "NSString+URLEncoding.h"

@interface ViewController : UIViewController

@property (weak, nonatomic) IBOutlet UIImageView *imageView1;

@property (weak, nonatomic) IBOutlet UIImageView *imageView2;

@property (strong) ASINetworkQueue  *networkQueue;

- (IBAction)onClick:(id)sender;

@end

---------------------------------------------------------

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad

{

[super viewDidLoad];

}

- (void)didReceiveMemoryWarning

{

[super didReceiveMemoryWarning];

}

- (IBAction)onClick:(id)sender {

if (!_networkQueue) {

_networkQueue = [[ASINetworkQueue alloc] init];

}

// 停止以前的队列

[_networkQueue cancelAllOperations];

// 创建ASI队列

[_networkQueue setDelegate:self];

[_networkQueue setRequestDidFinishSelector:@selector(requestFinished:)];

[_networkQueue setRequestDidFailSelector:@selector(requestFailed:)];

[_networkQueue setQueueDidFinishSelector:@selector(queueFinished:)];

for (int i=1; i<<span style="color: #272ad8">3; i++) {

NSString *strURL = [[NSString alloc] initWithFormat:@"http://www.crazyit.com/service/download.php?email=%@&FileName=test%i.jpg",@"[email protected]",i];

NSURL *url = [NSURL URLWithString:[strURL URLEncodedString]];

ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];

request.tag = i;

[_networkQueue addOperation:request];

}

[_networkQueue go];

}

- (void)requestFinished:(ASIHTTPRequest *)request

{

NSData *data = [request responseData];

// NSLog(@"data = %@",data);

NSError *eror;

NSDictionary *resDict = [NSJSONSerialization JSONObjectWithData:dataoptions:NSJSONReadingAllowFragments error:&eror];

//如果服务器是返回的图片过来,那是通过数据io流过来的,这里的 resDict值一定会为null, 因为 data不是json格式,所以NSJSONSerialization处理后是不能正解成json格式的。

NSLog(@"resDict = %@",resDict);

if (!resDict) {

UIImage *img = [UIImage imageWithData:data];

if (request.tag ==1) {

_imageView1.image = img;

} else {

_imageView2.image = img;

}

} else {

//如果服务器是返回的图片过来,那是通过数据io流过来的,这里的 resDict值一定会为null, 因为 data不是json格式,所以NSJSONSerialization处理后是不能正解成json格式的。

//如果是返回 json格式,一般类似于 {"ResultCode":-1} 格式,如果是图片io流返回, 一定不是json格式返回了

NSNumber *resultCodeObj = [resDict objectForKey:@"ResultCode"];

NSString *errorStr = [resultCodeObj errorMessage];

UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"错误信息"

message:errorStr

delegate:nil

cancelButtonTitle:@"OK"

otherButtonTitles: nil];

[alertView show];

}

if ([_networkQueue requestsCount] == 0) {

[self setNetworkQueue:nil];

}

NSLog(@"请求成功");

}

- (void)requestFailed:(ASIHTTPRequest *)request

{

NSError *error = [request error];

NSLog(@"%@",[error localizedDescription]);

if ([_networkQueue requestsCount] == 0) {

[self setNetworkQueue:nil];

}

NSLog(@"请求失败");

}

- (void)queueFinished:(ASIHTTPRequest *)request

{

if ([_networkQueue requestsCount] == 0) {

[self setNetworkQueue:nil];

}

NSLog(@"队列完成");

}

@end

-------------------------

#import

@interface NSNumber (Message)

-(NSString *)errorMessage;

@end

------------------------

#import "NSNumber+Message.h"

@implementation NSNumber (Message)

-(NSString *)errorMessage

{

NSString *errorStr = @"";

switch ([self integerValue]) {

case -9:

errorStr = @"文件没有指定。";

break;

case -8:

errorStr = @"文件找不到。";

break;

case -7:

errorStr = @"没有数据。";

break;

case -6:

errorStr = @"日期没有输入。";

break;

case -5:

errorStr = @"内容没有输入。";

break;

case -4:

errorStr = @"ID没有输入。";

break;

case -3:

errorStr = @"据访问失败。";

break;

case -2:

errorStr = @"您的账号最多能插入10条数据。";

break;

case -1:

errorStr = @"用户不存在,请到http://www.crazyit.com注册。";

default:

break;

}

return errorStr;

}

@end

时间: 2024-11-05 15:56:40

ASIHTTPRequest框架使用总结系列之阿堂教程4(下载数据)的相关文章

ASIHTTPRequest框架使用总结系列之阿堂教程2(同步请求)

从本篇开始,阿堂结合一些具体代码来说明.在ASIHTTPRequest框架中,与http请求相关的类有ASIHTTPRequest  和 ASIFormDataRequest,其中最常用的是 ASIHTTPRequest ,ASIFormDataRequest 是ASIHTTPRequest  的子类,可以发送html类似的表单数据,也可以上传数据,默认采用其它httpy请求方式.它们都可以进行异步或同步请求. 从性能和用户体验来说,阿堂是不建议用同步方式的,建议用异步方式.就是说在主线程中一般

ASIHTTPRequest框架使用总结系列之阿堂教程3(异步请求)

在上一节中,阿堂和网友们分享了ASIHTTPRequest框架对于get,post的同步请求方式.很显然,如果网速比较慢,查询的时候会一直很黑屏,直到请求结束界面才出现结果,这样用户体验肯定很不好了.正如上节阿堂所说,同步请求一般只是在某个子线程中使用,而不在主线程中使用. ASIHTTPRequest和ASIFormDataRequest两个请求类都可以发送异步请求,而后者继承了前者的异步请求方法,所以这里阿堂重点介绍ASIHTTPRequest的异步请求.异步请求后的处理通过回调委托对象的方

Angular系列---- AngularJS入门教程03:AngularJS 模板(转载)

是时候给这些网页来点动态特性了——用AngularJS!我们这里为后面要加入的控制器添加了一个测试. 一个应用的代码架构有很多种.对于AngularJS应用,我们鼓励使用模型-视图-控制器(MVC)模式解耦代码和分离关注点.考虑到这一点,我们用AngularJS来为我们的应用添加一些模型.视图和控制器. 请重置工作目录: git checkout -f step-2 我们的应用现在有了一个包含三部手机的列表. 步骤1和步骤2之间最重要的不同在下面列出.,你可以到GitHub去看完整的差别. 视图

Angular系列----AngularJS入门教程01:AngularJS模板 (转载)

是时候给这些网页来点动态特性了——用AngularJS!我们这里为后面要加入的控制器添加了一个测试. 一个应用的代码架构有很多种.对于AngularJS应用,我们鼓励使用模型-视图-控制器(MVC)模式解耦代码和分离关注点.考虑到这一点,我们用AngularJS来为我们的应用添加一些模型.视图和控制器. 请重置工作目录: git checkout -f step-2 我们的应用现在有了一个包含三部手机的列表. 步骤1和步骤2之间最重要的不同在下面列出.,你可以到GitHub去看完整的差别. 视图

Angular系列------AngularJS入门教程:导言和准备(转载)

学习AngularJS的一个好方法是逐步完成本教程,它将引导您构建一个完整的AngularJS web应用程序. 该web应用是一个Android设备清单的目录列表,您可以筛选列表以便查看您感兴趣的设备,然后查看设备的详细信息. 本教程将向您展示AngularJS怎样使得web应用更智能更灵活,而且不需要各种扩展程序或插件. 通过本教程的学习,您将: 阅读示例学习怎样使用AngularJS的客户端数据绑定和依赖注入功能来建立可立即响应用户操作的动态数据视图. 学习如何使用AngularJS创建数

玩转Google开源C++单元测试框架Google Test系列(gtest)之一 初识gtest

进入文件夹执行: ./configure make make install 完毕即可正常使用: (1)包含include目录 -I/root/scp/gtest/gtest-1.3.0: (2)包含lib中的动态链接库:-lgtest -L/root/scp/gtest/gtest-1.3.0/lib 示例代码: [cpp] view plaincopy #include <gtest/gtest.h> int Foo(int a, int b) { if (a == 0 || b == 0

Angular系列----AngularJS入门教程04:迭代器过滤(转载)

我们在上一步做了很多基础性的训练,所以现在我们可以来做一些简单的事情喽.我们要加入全文检索功能(没错,这个真的非常简单!).同时,我们也会写一个端到端测试,因为一个好的端到端测试可以帮上很大忙.它监视着你的应用,并且在发生回归的时候迅速报告. 请重置工作目录: git checkout -f step-3 我们的应用现在有了一个搜索框.注意到页面上的手机列表随着用户在搜索框中的输入而变化. 步骤2和步骤3之间最重要的不同在下面列出.你可以在GitHub里看到完整的差别. 控制器 我们对控制器不做

玩转Google开源C++单元测试框架Google Test系列(转载)

越来越多公司采用敏捷开发,单元和回归测试越来越重要,GTest作为最佳C++单元测试工具越来越多的被使用.转自 http://www.cnblogs.com/coderzh/archive/2009/04/06/1426755.html 前段时间学习和了解了下Google的开源C++单元测试框架Google Test,简称gtest,非常的不错. 我们原来使用的是自己实现的一套单元测试框架,在使用过程中,发现越来越多使用不便之处,而这样不便之处,gtest恰恰很好的解决了. 其实gtest本身的

Angular系列----AngularJS入门教程00:引导程序(转载)

我们现在开始准备编写AngularJS应用——phonecat.这一步骤(步骤0),您将会熟悉重要的源代码文件,学习启动包含AngularJS种子项目的开发环境,并在浏览器端运行应用. 进入angular-phonecat目录,运行如下命令: git checkout -f step-0 该命令将重置phonecat项目的工作目录,建议您在每一学习步骤运行此命令,将命令中的数字改成您学习步骤对应的数字,该命令将清除您在工作目录内做的任何更改. 运行以下命令: node scripts/web-s