成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

IOS開發:ASIHTTPRequest中HTTP請求終結者詳解

移動開發 iOS
IOS開發中ASIHTTPRequest里HTTP請求終結者詳解是本文要介紹的內容,主要是來學習IOS開發中請求同步的問題。具體內容的實現來看本文詳解。

IOS開發ASIHTTPRequestHTTP請求終結者詳解是本文要介紹的內容,主要是來學習IOS開發請求同步的問題。今天把這個的官方文檔翻譯的出來以做分享,讓迷途之人有路可尋.具體內容來考哪本文詳細內容講解。

ASIHTTPRequest是一款極其強勁的HTTP訪問開源項目。讓簡單的API完成復雜的功能,

如:

異步請求,隊列請求,GZIP壓縮,緩存,斷點續傳,進度跟蹤,上傳文件,HTTP認證

在新的版本中,還加入了Objective-C閉包Block的支持,讓我們的代碼更加輕簡靈活。

下面就舉例說明它的API用法。

發起一個同步請求

同步意為著線程阻塞,在主線程中使用此方法會使應用Hang住而不響應任何用戶事件。所以,在應用程序設計時,大多被用在專門的子線程增加用戶體驗,或用異步請求代替(下面會講到)。

  1. - (IBAction)grabURL:(id)sender   
  2.  
  3. {   
  4.   NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"];   
  5.   ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];   
  6.   [request startSynchronous];   
  7.   NSError *error = [request error];   
  8.   if (!error) {   
  9.     NSString *response = [request responseString];   
  10.   }   
  11. }  

(1)用requestWithURL快捷方法獲取ASIHTTPRequest的一個實例

(2)startSynchronous 方法啟動同步訪問,

(3)由于是同步請求,沒有基于事件的回調方法,所以從request的error屬性獲取錯誤信息。

(4)responseString,為請求的返回NSString信息。

創建一個異步請求

異步請求的好處是不阻塞當前線程,但相對于同步請求略為復雜,至少要添加兩個回調方法來獲取異步事件。

下面異步請求代碼完成上面同樣的一件事情:

  1. - (IBAction)grabURLInBackground:(id)sender   
  2. {   
  3.    NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"];   
  4.    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];   
  5.    [request setDelegate:self];   
  6.    [request startAsynchronous];   
  7. }   
  8.     
  9. - (void)requestFinished:(ASIHTTPRequest *)request   
  10. {   
  11.    // Use when fetching text data   
  12.    NSString *responseString = [request responseString];   
  13.     
  14.    // Use when fetching binary data   
  15.    NSData *responseData = [request responseData];   
  16. }   
  17.     
  18. - (void)requestFailed:(ASIHTTPRequest *)request   
  19. {   
  20.    NSError *error = [request error];   
  21. }  

(1)與上面不同的地方是指定了一個 "delegate",并用startAsynchronous來啟動網絡請求。

(2)在這里實現了兩個delegate的方法,當數據請求成功時會調用requestFinished,請求失敗時(如網絡問題或服務器內部錯誤)會調用requestFailed。

隊列請求

提供了一個對異步請求更加精準豐富的控制。

如,可以設置在隊列中,同步請求的連接數。往隊列里添加的請求實例數大于maxConcurrentOperationCount時,請求實例將被置為等待,直到前面至少有一個請求完成并出列才被放到隊列里執行。

也適用于當我們有多個請求需求按順序執行的時候(可能是業務上的需要,也可能是軟件上的調優),僅僅需要把maxConcurrentOperationCount設為“1”。

  1. - (IBAction)grabURLInTheBackground:(id)sender   
  2. {   
  3.    if (![self queue]) {   
  4.       [self setQueue:[[[NSOperationQueue alloc] init] autorelease]];   
  5.    }   
  6.     
  7.    NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"];   
  8.    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];   
  9.    [request setDelegate:self];   
  10.    [request setDidFinishSelector:@selector(requestDone:)];   
  11.    [request setDidFailSelector:@selector(requestWentWrong:)];   
  12.    [[self queue] addOperation:request]; //queue is an NSOperationQueue   
  13. }   
  14.     
  15. - (void)requestDone:(ASIHTTPRequest *)request   
  16. {   
  17.    NSString *response = [request responseString];   
  18. }   
  19.     
  20. - (void)requestWentWrong:(ASIHTTPRequest *)request   
  21. {   
  22.    NSError *error = [request error];   
  23. }  

創建NSOperationQueue,這個Cocoa架構的執行任務(NSOperation)的任務隊列。我們通過ASIHTTPRequest.h的源碼可以看到,此類本身就是一個NSOperation的子類。也就是說它可以直接被放到"任務隊列"中,并被執行。上面的代碼隊了隊列的創建與添加操作外,其它代碼與上一例一樣。

隊列異步請求中中獲取或識別不同request小技巧

(1)可以設置一個上下文(userInfo)到request對象中,當請求響應完后可以通過訪問request對象的userInfo獲取里面的信息

(2)為每一個請求實例設置不同的setDidFinishSelector / setDidFailSelector的回調方法

(3)子類化ASIHTTPRequest,重寫requestFinished: 與 failWithProblem:方法

ASINetworkQueues, 它的delegate提供更為豐富的功能

提供的更多的回調方法如下:

(1)requestDidStartSelector,請求發起時會調此方法,你可以在此方法中跟據業務選擇性的設置request對象的deleaget。

(2)requestDidReceiveResponseHeadersSelector,當接受完響應的Header后設計此方法,這個對下載大數據的時候相當有用,你可以在方法里做更多業務上的處理。

(3)requestDidFinishSelector,請求并響應成功完成時調用此方法

(4)requestDidFailSelector,請求失敗

(5)queueDidFinishSelector,整個隊列里的所有請求都結束時調用此方法。
 
它是NSOperationQueues的擴展,小而強大。但也與它的父類略有區別。如,僅添加到隊列中其實并不能執行請求,只有調用[  queue g o ]才會執行;一個正在運行中的隊列,并不需要重復調用[  queue go  ]。

引用

<text">

默認情況下,隊列中的一個請求如果失敗,它會取消所有未完成的請求。可以設置[  queue setShouldCancelAllRequestsOnFailure:NO  ]來修正。

取消異步請求

首先,同步請求是不能取消的。

其次,不管是隊列請求,還是簡單的異步請求,全部調用[ request cancel ]來取消請求。

引用

取消的請求默認都會按請求失敗處理,并調用請求失敗delegate。

如果不想調用delegate方法,則設置:[ request clearDelegatesAndCancel];

隊列請求中需要注意的是,如果你取消了一個請求,隊列會自動取消其它所有請求。

如果只想取消一個請求,可以設置隊列:[ queue setShouldCancelAllRequestsOnFailure:NO ];

如果想明確取消所有請求:[ queue cancelAllOperations ];

安全的內存回收建議

request并沒有retain你的delegate,所以在沒有請求完的時候釋放了此delegate,需要在dealloc方法里先取消所有請求,再釋放請求實例,如:

  1. - (void)dealloc   
  2. {   
  3.    [request clearDelegatesAndCancel];   
  4.    [request release];   
  5.    ...   
  6.    [super dealloc];   
  7. }  

向服務器端上傳數據

ASIFormDataRequest ,模擬 Form表單提交,其提交格式與 Header會自動識別。

沒有文件:application/x-www-form-urlencoded

有文件:multipart/form-data

  1. ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];   
  2. [request setPostValue:@"Ben" forKey:@"first_name"];   
  3. [request setPostValue:@"Copsey" forKey:@"last_name"];   
  4. [request setFile:@"/Users/ben/Desktop/ben.jpg" forKey:@"photo"];   
  5. [request addData:imageData withFileName:@"george.jpg" andContentType:@"image/jpeg" forKey:@"photos"];  

如果要發送自定義數據:

  1. [request responseStatusCode];   
  2. [[request responseHeaders] objectForKey:@"X-Powered-By"];   
  3. [request responseEncoding];  

下載文件

通過設置request的setDownloadDestinationPath,可以設置下載文件用的下載目標目錄。

首先,下載過程文件會保存在temporaryFileDownloadPath目錄下。如果下載完成會做以下事情:

1、如果數據是壓縮的,進行解壓,并把文件放在downloadDestinationPath目錄中,臨時文件被刪除

2、如果下載失敗,臨時文件被直接移到downloadDestinationPath目錄,并替換同名文件。

如果你想獲取下載中的所有數據,可以實現delegate中的request:didReceiveData:方法。但如果你實現了這個方法,request在下載完后,request并不把文件放在downloadDestinationPath中,需要手工處理。

獲取響應信息

信息:status , header, responseEncoding

  1. [request responseStatusCode];   
  2. [[request responseHeaders] objectForKey:@"X-Powered-By"];   
  3. [request responseEncoding];  

獲取請求進度

有兩個回調方法可以獲取請求進度,

1、downloadProgressDelegate,可以獲取下載進度

2、uploadProgressDelegate,可以獲取上傳進度

cookie的支持

如果Cookie存在的話,會把這些信息放在NSHTTPCookieStorage容器中共享,并供下次使用。

你可以用[ ASIHTTPRequest setSessionCookies:nil ] ; 清空所有Cookies。

當然,你也可以取消默認的Cookie策略,而使自定義的Cookie:

  1. //Create a cookie   
  2. NSDictionary *properties = [[[NSMutableDictionary alloc] init] autorelease];   
  3. [properties setValue:[@"Test Value" encodedCookieValue] forKey:NSHTTPCookieValue];   
  4. [properties setValue:@"ASIHTTPRequestTestCookie" forKey:NSHTTPCookieName];   
  5. [properties setValue:@".allseeing-i.com" forKey:NSHTTPCookieDomain];   
  6. [properties setValue:[NSDate dateWithTimeIntervalSinceNow:60*60] forKey:NSHTTPCookieExpires];   
  7. [properties setValue:@"/asi-http-request/tests" forKey:NSHTTPCookiePath];   
  8. NSHTTPCookie *cookie = [[[NSHTTPCookie alloc] initWithProperties:properties] autorelease];   
  9.     
  10. //This url will return the value of the 'ASIHTTPRequestTestCookie' cookie   
  11. url = [NSURL URLWithString:@"http://allseeing-i.com/ASIHTTPRequest/tests/read_cookie"];   
  12. request = [ASIHTTPRequest requestWithURL:url];   
  13. [request setUseCookiePersistence:NO];   
  14. [request setRequestCookies:[NSMutableArray arrayWithObject:cookie]];   
  15. [request startSynchronous];   
  16.     
  17. //Should be: I have 'Test Value' as the value of 'ASIHTTPRequestTestCookie'   
  18. NSLog(@"%@",[request responseString]);  

大文件斷點續傳

0.94以后支持大文件的斷點下載,只需要設置:

  1. [ request setAllowResumeForFileDownloads:YES ];  
  2. [ request setDownloadDestinationPath:downloadPath ]; 

就可以了。

小結:IOS開發ASIHTTPRequestHTTP請求終結者詳解的內容介紹完了,希望通過本文的學習能對你有所幫助。

責任編輯:zhaolei 來源: 新浪博客
相關推薦

2012-09-10 09:28:51

2018-05-06 16:52:51

2013-11-15 10:15:55

HA系統張振倫HypervisorH

2011-09-06 14:36:34

觸摸菜單ipad應用電子點菜

2011-08-10 17:37:00

iPhoneASIHTTPRequ

2017-11-13 09:00:44

寬帶服務DDoS

2014-08-29 16:43:58

GitHubLinux

2015-12-09 10:41:51

2013-12-30 10:37:59

2011-08-11 13:35:28

iPhoneASIHTTPRequHTTP

2009-08-24 15:22:37

云計算技術性工作

2010-09-09 15:10:56

2021-08-28 09:04:54

死鎖順序鎖輪詢鎖

2011-10-11 10:02:48

2016-01-15 11:39:46

物聯網互聯網

2009-08-04 21:46:53

IBM動態架構DI

2013-07-22 13:48:55

iOS開發ASIHTTPRequ使用Cookie

2024-10-10 14:11:51

2009-04-03 08:54:38

Windows 7微軟操作系統

2024-08-07 10:19:00

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲欧美国产精品一区二区 | 一级在线观看 | 黄色一级网| 国产999精品久久久久久绿帽 | 久久国产一区 | 综合色婷婷 | 男人天堂网av | 国产成人高清 | 日韩中文在线视频 | 91久久久www播放日本观看 | 中日韩av | 国产精品久久久久久久久久不蜜臀 | 久久天天躁狠狠躁夜夜躁2014 | 天天干天天插天天 | 一区二区三区观看视频 | 四虎最新| 日本一区二区三区在线观看 | 国产欧美精品一区二区三区 | 久草新在线| 亚洲欧美成人在线 | 欧美成人视屏 | 欧美一区二区三区 | 成人超碰在线 | 日韩欧美综合在线视频 | 婷婷免费视频 | 久久网站黄 | 国产二区精品视频 | 成人三区| 亚洲第一天堂 | 精品免费视频 | 精品成人一区二区 | 91精品久久久久久久久中文字幕 | 午夜电影福利 | 日韩一区二区在线观看 | 久久国产欧美日韩精品 | 亚洲精品国产成人 | 亚洲日韩中文字幕一区 | 国产精品久久久久久久久婷婷 | 午夜在线 | 一区二区三区四区五区在线视频 | 超碰精品在线 |