iOS网络编程-ASIHTTPRequest小例子-数据请求队列

来源:互联网 发布:工信部证书有用吗 知乎 编辑:程序博客网 时间:2024/04/30 17:35

实例:请求队列

我们通过一个例子介绍一下请求队列使用,我们设计了一个应用,用户点击GO按钮从服务器同时下载两张图片显示在画面中。

 7

我们直接看看主视图控制器ViewController.h代码如下:

[cpp] view plaincopy
  1. #import “ASIHTTPRequest.h”  
  2.   
  3. #import “ASINetworkQueue.h”  
  4.   
  5. #import “NSNumber+Message.h”  
  6.   
  7. #import “NSString+URLEncoding.h”  
  8.   
  9.    
  10.   
  11. @interface ViewController : UIViewController  
  12.   
  13.    
  14.   
  15. @property (weak, nonatomic) IBOutlet UIImageView *imageView1;  
  16.   
  17. @property (weak, nonatomic) IBOutlet UIImageView *imageView2;  
  18.   
  19. @property (strong) ASINetworkQueue  *networkQueue;  
  20.   
  21.    
  22.   
  23. - (IBAction)onClick:(id)sender;  
  24.   
  25. @end  


我们需要引入ASI框架的两个头文件ASIHTTPRequest.h和ASINetworkQueue.h。其中imageView1和 imageView2是与画面对应的两个图片视图控件。还定义了ASINetworkQueue  类型的networkQueue属性。我们直接看看主视图控制器ViewController.m中点击GO按钮调用方法,代码如下:

[cpp] view plaincopy
  1. - (IBAction)onClick:(id)sender {  
  2.   
  3. if (!_networkQueue) {  
  4.   
  5. _networkQueue = [[ASINetworkQueue alloc] init];                       ①  
  6.   
  7. }  
  8.   
  9. // 停止以前的队列  
  10.   
  11. [_networkQueue cancelAllOperations];                                      ②  
  12.   
  13. // 创建ASI队列  
  14.   
  15. [_networkQueue setDelegate:self];  
  16.   
  17. [_networkQueue setRequestDidFinishSelector:@selector(requestFinished:)];      ③  
  18.   
  19. [_networkQueue setRequestDidFailSelector:@selector(requestFailed:)];          ④  
  20.   
  21. [_networkQueue setQueueDidFinishSelector:@selector(queueFinished:)];          ⑤  
  22.   
  23.    
  24.   
  25. for (int i=1; i<3; i++) {  
  26.   
  27. NSString *strURL = [[NSString alloc] initWithFormat:  
  28.   
  29. @”http://iosbook3/download.php?email=%@&FileName=test%i.jpg”,  
  30.   
  31. @”<你的iosbook1.com用户邮箱>”,i];  
  32.   
  33. NSURL *url = [NSURL URLWithString:[strURL URLEncodedString]];  
  34.   
  35. ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];  
  36.   
  37. request.tag = i;                                                  ⑥  
  38.   
  39. [_networkQueue addOperation:request];                                   ⑦  
  40.   
  41. }  
  42.   
  43. [_networkQueue go];                                                   ⑧  
  44.   
  45. }  


我们再看看它们的回调方法,代码:

[cpp] view plaincopy
  1. - (void)requestFinished:(ASIHTTPRequest *)request  
  2.   
  3. {  
  4.   
  5. NSData *data = [request responseData];  
  6.   
  7. NSError *eror;  
  8.   
  9. NSDictionary *resDict = [NSJSONSerialization JSONObjectWithData:data  
  10.   
  11. options:NSJSONReadingAllowFragments error:&eror];  
  12.   
  13. if (!resDict) {  
  14.   
  15. UIImage *img = [UIImage imageWithData:data];  
  16.   
  17. if (request.tag ==1) {                                                ①  
  18.   
  19. _imageView1.image = img;  
  20.   
  21. else {  
  22.   
  23. _imageView2.image = img;  
  24.   
  25. }  
  26.   
  27. else {  
  28.   
  29. NSNumber *resultCodeObj = [resDict objectForKey:@"ResultCode"];  
  30.   
  31. NSString *errorStr = [resultCodeObj errorMessage];  
  32.   
  33. UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@”错误信息”  
  34.   
  35. message:errorStr  
  36.   
  37. delegate:nil  
  38.   
  39. cancelButtonTitle:@”OK”  
  40.   
  41. otherButtonTitles: nil];  
  42.   
  43. [alertView show];  
  44.   
  45. }  
  46.   
  47. if ([_networkQueue requestsCount] == 0) {                                    ②  
  48.   
  49. [self setNetworkQueue:nil];  
  50.   
  51. }  
  52.   
  53. NSLog(@”请求成功”);  
  54.   
  55. }  
  56.   
  57. - (void)requestFailed:(ASIHTTPRequest *)request                              ③  
  58.   
  59. {  
  60.   
  61. NSError *error = [request error];  
  62.   
  63. NSLog(@”%@”,[error localizedDescription]);  
  64.   
  65. if ([_networkQueue requestsCount] == 0) {  
  66.   
  67. [self setNetworkQueue:nil];  
  68.   
  69. }  
  70.   
  71. NSLog(@”请求失败”);  
  72.   
  73. }  
  74.   
  75. - (void)queueFinished:(ASIHTTPRequest *)request                              ④  
  76.   
  77. {  
  78.   
  79. if ([_networkQueue requestsCount] == 0) {  
  80.   
  81. [self setNetworkQueue:nil];  
  82.   
  83. }  
  84.   
  85. NSLog(@”队列完成”);  
  86.   
  87. }  


requestFinished:方法是请求对象成功回调方法,因此有两个请求对象它会被调用两次,在第①行代码中我们根据GO按钮点击事件设定的 请求对象的tag属性,来判断是哪个请求对象的回调。进而加载到显示不同的图片视图。第②代码[_networkQueue requestsCount]可以判断队列中请求对象的个数。