ASIHTTPRequest架構是優秀的第三方Objective-C的HTTP架構,支援Mac OS X和iOS下的HTTP開發。
一、ASIHTTPRequest架構的安裝和配置
(1)首先要在項目工程中匯入相關的檔案,包括:ASIHttpRequest檔案夾和Reachability檔案夾。
(2)要匯入相關的支援類庫和架構。包括:
CFNetwork.framework
SystemConfiguration.framework
MobileCoreServices.framework
libz.dylib
(3)由於ASIHTTPRequest是不支援ARC的,所以在添加了ARC特性的項目中就會出現ARC報錯,解決的方法也很簡單,對ASIHTTPRequest的相關檔案添加ARC特性,做法就是在target中選擇Build
Phases,再選擇compile sources中ASIHTTPRequest的檔案,雙擊彈出對話方塊,添加參數“-fno-objc-arc”。問題解決。
二、同步請求
首先需要匯入ASIHTTPRequest標頭檔。
NSString *urlString = @"*****"; ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:urlString]]; [request startSynchronous]; NSError *error = [request error]; if (!error) { NSData *data = [request responseData]; NSString *string = [request responseString]; }
這是一段簡單的同步請求的代碼。其中的responseData返回的是位元據,而responseString返回的是文本資料。
三、非同步請求
附註:我們運行程式,如果網速很慢,查詢的時候會一直黑屏,直到請求結束畫面才出現,這樣使用者體驗很不好。因此同步請求一般只是在某個子線 程中使用,而不在主線程中使用。非同步請求的使用者體驗要比同步請求好,因此一般情況下非同步請求用的很多。等待過程中在狀態列上會出現網路等待指標的經典旋
轉小表徵圖,而使用ASIHTTPRequest非同步請求就實現這些效果,不用自己額外編寫代碼。
非同步請求需要實現代理方法
NSString *urlString = @"*****"; ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:urlString]]; [request setDelegate:self]; [request startAsynchronous];
需要實現兩個代理方法:
- (void)requestFinished:(ASIHTTPRequest *)request { NSData *data = [request responseData]; NSString *string = [request responseString];}- (void)requestFailed:(ASIHTTPRequest *)request { NSError *error = [request error]; if (error) { NSLog(@"request failed"); }}
這兩個方法是預設的回調方法,從伺服器擷取資料成功就回調第一個方法,否則回調第二個方法。當然也可以自己定義回調方法。
[request setDidFinishSelector:@selector(requestSuccess:)]; [request setDidFailSelector:@selector(requestError:)];
然後再實現這兩個自訂的回調方法。
- (void)requestSuccess:(ASIHTTPRequest *)request { NSData *data = [request responseData]; NSString *string = [request responseString];}- (void)requestError:(ASIHTTPRequest *)request { NSError *error = [request error]; if (error) { NSLog(@"request failed"); }}
在非同步請求中往往為了代碼更加簡潔可以使用代碼塊(block),在代碼塊中指定回調方法。
NSString *urlString = @"*****"; __weak ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:urlString]]; [request setCompletionBlock:^{ // Use when fetching text data NSString *responseString = [request responseString]; // Use when fetching binary data NSData *responseData = [request responseData]; }]; [request setFailedBlock:^{ NSError *error = [request error]; if (error) { NSLog(@"request failed"); } }]; [request startAsynchronous];
四、請求隊列