读书人

iOS网络编程-ASIHTTPRequest小例证-数

发布时间: 2013-04-24 12:02:11 作者: rapoo

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

实例:请求队列

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

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

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

#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

?

?

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

- (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<3; i++) {NSString *strURL = [[NSString alloc] initWithFormat:@”http://iosbook3/download.php?email=%@&FileName=test%i.jpg”,@”<你的iosbook1.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];NSError *eror;NSDictionary *resDict = [NSJSONSerialization JSONObjectWithData:dataoptions:NSJSONReadingAllowFragments error:&eror];if (!resDict) {UIImage *img = [UIImage imageWithData:data];if (request.tag ==1) {                                                ①_imageView1.image = img;} else {_imageView2.image = img;}} else {NSNumber *resultCodeObj = [resDict objectForKey:@"ResultCode"];NSString *errorStr = [resultCodeObj errorMessage];UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@”错误信息”message:errorStrdelegate:nilcancelButtonTitle:@”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(@”队列完成”);}

?

?

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

读书人网 >操作系统

热点推荐