需要的类:ASIHTTPRequest和ASINetworkQueue。
ASIHTTPRequest被设计成NSOperation子类,ASINetworkQueue被设计成NSOperationQueue子类。
NSOperationQueue和NSOperation关系的形象比喻:
NSOperationQueue看成一个线程管理器,那么一个NSOperation就相当于一个线程,它们被添加到NSOperationQueue队列中有序地执行。
ASINetworkQueue和ASIHTTPRequest也可以看成上面的概念。
@interface viewController : UIViewController
@property (strong) ASINetworkQueue *networkQueue;
- (IBAction)onClick:(id)sender;
@end
- (IBAction)onClick:(id)sender
{
if(!_networkQueue)
{
_networkQueue = [[ASINetWorkQueue alloc] init]; 【1】
}
// 停止以前的队列
[_networkQueue cancelAllOperations]; 【2】
// 创建ASI队列
[_networkQueue setDelegate:self];
[_networkQueue setRequestDidFinishSelector:@selector(requestFinished:)]; 【3】
[_networkQueue setRequestFailSelector:@selector(requestFailed:)]; 【4】
[_networkQueue setQueueDidFinishSelector:@selector(queueFinished)]; 【5】
for (int i = 0 ; i < 3 ; i++)
{
NSString *strUrl = [[NSString alloc] initWithFormat:@"http://iosbook3.com/service/download.php? email=%@&type=%@&action=%@",@"ios_yaoxinchao@163.com",@"JSON",@"query"];
NSURL *url = [NSURL URLWithString:[strUrl URLEncodedString]];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
request.tag = i; 【6】
// 将线程任务添加到队列
[_networkQueue addOperation:request]; 【7】
}
[_networkQueue go]; 【8】
}
【1】:创建ASINetworkQueue对象
【2】:停止以前的队列
【3】:设置请求成功的回调
【4】:设置请求失败的回调
【5】:设置队列完成(所有请求完成)的回调方法
【6】:由于有多个请求,请求成功还是失败他们都调用同样的方法,通过请求对象的tag属性区分返回的是哪一个请求
【7】:将请求对象放入队列
【8】:执行队列
实现代理方法:
......
【注】:[_networkQueue requestsCunt]可以判断队列中请求对象的个数。