从本篇开始,阿堂准备进一步介绍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",@"heyitang@qq.com",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

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

  1. ASIHTTPRequest框架使用总结系列之阿堂教程1(安装配置篇

    在前年,阿堂在<IOS开发系列之阿堂教程:玩转IPhone客户端和Web服务端交互(客户端)实践>一文中,对于ASIHTTPRequest框架有过一些介简单绍,具体链接地址见http:// ...

  2. ASIHTTPRequest框架使用总结系列之阿堂教程5(上传数据)

    在上篇文章中,阿堂和网友们分享了如何用ASIHTTPRequest框架下载数据的实例,本篇阿堂将数据介绍如何用ASIHTTPRequest框架上传数据的应用实例.       数据上传是通过ASIHT ...

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

    在上一节中,阿堂和网友们分享了ASIHTTPRequest框架对于get,post的同步请求方式.很显然,如果网速比较慢,查询的时候会一直很黑屏,直到请求结束界面才出现结果,这样用户体验肯定很不好了. ...

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

    从本篇开始,阿堂结合一些具体代码来说明.在ASIHTTPRequest框架中,与http请求相关的类有ASIHTTPRequest  和 ASIFormDataRequest,其中最常用的是 ASIH ...

  5. IOS开发系列之阿堂教程:玩转IPhone客户端和Web服务端交互(客户端)实践

    说到ios的应用开发,我们不能不提到web server服务端,如果没有服务端的支持,ios应用开发就没有多大意义了,因为从事过手机开发的朋友都知道(Android也一样),大量复杂业务的处理和数据库 ...

  6. [转载]IOS项目打包除去NSLog和NSAssert处理之阿堂教程

    原文链接地址:http://blog.sina.com.cn/s/blog_81136c2d0102v1ck.html 原文地址:IOS项目打包除去NSLog和NSAssert处理之阿堂教程作者:时空 ...

  7. CRL快速开发框架系列教程十一(大数据分库分表解决方案)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  8. CRL快速开发框架系列教程三(更新数据)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  9. CRL快速开发框架系列教程四(删除数据)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

随机推荐

  1. try...catch 语句

    一般情况下,我们很少用到 try...catch 语句,但是有时候为了测试代码中的错误,也有可能会用到.小白我也在工作中用到过.那么好的程序设计,什么时候会用到呢? try...catch 一般用来捕 ...

  2. CSLA多语言设置

    1.在程序运行文件夹例如“\Bin\Debug\”中包含csla生成的资源文件: 2.在程序运行时,设置CSLA的当前语言为你想要的语言,例如:Csla.Properties.Resources.Cu ...

  3. (总结)Linux服务器上最简单的Nginx反向代理配置

    Nginx不但是一款高性能的Web服务器,也是高性能的反向代理服务器.下面简单说说Nginx的反向代理功能. 反向代理是什么? 反向代理指以代理服务器来接受Internet上的连接请求,然后将请求转发 ...

  4. asp.net 条码 一维条码 生成, 一共有32中格式类型

    想用asp.net 实现条码功能,网上找了代码都不全. 终于找到了一个非常全的DLL 是winForm的,原以为不能用在WEB 上结果 可以使用. 首先,引用 DLL 不必说了,下面是 使用设置.还有 ...

  5. 【Nescafé 31】杯NOIP模拟赛

    t1 题意:n*m的棋盘上从(1,1)走到(n,m),只能向下或向右,一些格子有老鼠,每个老鼠互不相同,当处于与老鼠有重边的格子时,视为看见了这只老鼠,求到终点看到最少的不同老鼠数. 分析:DP 由于 ...

  6. 2016年NK冬季训练赛 民间题解

    A题 水题,考察对行的读入和处理,注意使用long long #include <iostream> #include <cstring> #include <cstdi ...

  7. jQuery仿3D旋转木马效果插件(带索引按钮)

    项目中需要用到旋转木马效果,但是我在网上找的插件,基本都是不带按钮或者只是带前后按钮的,而项目要求的是带索引按钮,也就是说有3张图片轮播,对应的要有3个小按钮,点击按钮,对应的图片位于中间位置.于是就 ...

  8. 【转】去掉HTML5中number类型input字段的小箭头

    第一种方案: 在chrome下: input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{    -webkit-appea ...

  9. 《c程序设计语言》读书笔记-4.2-扩充atof函数

    #include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> ...

  10. Codeforces Round #336 (Div. 2) A

    A. Saitama Destroys Hotel time limit per test 1 second memory limit per test 256 megabytes input sta ...