閱讀435 返回首頁    go 阿裏雲 go 技術社區[雲棲]


iOS網絡編程-ASIHTTPRequest小例子-數據請求隊列

實例:請求隊列

我們通過一個例子介紹一下請求隊列使用,我們設計了一個應用,用戶點擊GO按鈕從服務器同時下載兩張圖片顯示在畫麵中。

 7

我們直接看看主視圖控製器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:

@”https://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:data

options: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: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(@”隊列完成”);

}


requestFinished:方法是請求對象成功回調方法,因此有兩個請求對象它會被調用兩次,在第①行代碼中我們根據GO按鈕點擊事件設定的 請求對象的tag屬性,來判斷是哪個請求對象的回調。進而加載到顯示不同的圖片視圖。第②代碼[_networkQueue requestsCount]可以判斷隊列中請求對象的個數。

最後更新:2017-04-03 20:51:31

  上一篇:go JQuery Mobile+ iscroll 列表滾動條的實現
  下一篇:go mac卸載MySQL