iOS網絡編程-ASIHTTPRequest小例子-數據請求隊列
實例:請求隊列
我們通過一個例子介紹一下請求隊列使用,我們設計了一個應用,用戶點擊GO按鈕從服務器同時下載兩張圖片顯示在畫麵中。
我們直接看看主視圖控製器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
