iOS開發:ASIHTTPRequest進度追蹤

來源:互聯網
上載者:User

   本文為大家介紹了發ASIHTTPRequest進度追蹤的內容,其中包括追蹤單個request的下載進度,追蹤一系列request的下載進度,追蹤單個request的上傳進度,追蹤一系列request的上傳進度,精確進度條vs簡單進度條,自訂進度追蹤等等內容。

  每個ASIHTTPRequest有兩個delegate用來追蹤進度:

  downloadProgressDelegate (下載) 和 uploadProgressDelegate (上傳)。

  進度delegate可以是NSProgressIndicators (Mac OS X) 或者 UIProgressViews (iPhone).ASIHTTPRequest會自適應這兩個class的行為。你也可以使用自訂class作為進度delegate,只要它響應setProgress:函數。

  如果你執行單個request,那麼你需要為該request設定upload/download進度delegate

  如果你在進行多個請求,並且你想要追蹤整個隊列中的進度,你必須使用ASINetworkQueue並設定隊列的進度delegate

  如果上述兩者你想同時擁有,恭喜你,0.97版以後的ASIHTTPRequest,這個可以有 ^ ^

  IMPORTANT:如果你向一個要求身分識別驗證的網站上傳資料,那麼每次授權失敗,上傳進度條就會被重設為上一次的進度值。因此,當與需要授權的web伺服器互動時,建議僅當useSessionPersistence為YES時才使用上傳進度條,並且確保你在追蹤大量資料的上傳進度之前,先使用另外的request來進行授權。

  追蹤小於128KB的資料上傳進度目前無法做到,而對於大於128kb的資料,進度delegate不會收到第一個128kb資料區塊的進度資訊。這是因為CFNetwork庫API的限制。我們曾向apple提交過bug報告(bug id 6596016),希望apple能修改CFNetwork庫以便實現上述功能。

  2009-6-21:Apple的哥們兒們真棒!iPhone 3.0 SDK裡,buffer大小已經被減小到32KB了,我們的上傳進度條可以更精確了。

  追蹤單個request的下載進度

  這個例子中, myProgressIndicator是個 NSProgressIndicator.

  ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];

  [request setDownloadProgressDelegate:myProgressIndicator];

  [request startSynchronous];

  NSLog(@"Max: %f, Value: %f", [myProgressIndicator maxValue],[myProgressIndicator doubleValue]);

  追蹤一系列request的下載進度

  在這個例子中, myProgressIndicator 是個 UIProgressView, myQueue是個 ASINetworkQueue.

  - (void)fetchThisURLFiveTimes:(NSURL *)url

  {

  [myQueue cancelAllOperations];

  [myQueue setDownloadProgressDelegate:myProgressIndicator];

  [myQueue setDelegate:self];

  [myQueue setRequestDidFinishSelector:@selector(queueComplete:)];

  int i;

  for (i=0; i<5; i++) {

  ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];

  [myQueue addOperation:request];

  }

  [myQueue go];

  }

  - (void)queueComplete:(ASINetworkQueue *)queue

  {

  NSLog(@"Value: %f", [myProgressIndicator progress]);

  }

  這個例子中,我們已經為ASINetworkQueues調用過[myQueue go]了。

  追蹤單個request的上傳進度

  在這個例子中, myProgressIndicator 是個 UIProgressView。

  ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];

  [request setPostValue:@"Ben" forKey:@"first_name"];

  [request setPostValue:@"Copsey" forKey:@"last_name"];

  [request setUploadProgressDelegate:myProgressIndicator];

  [request startSynchronous];

  NSLog(@"Value: %f",[myProgressIndicator progress]);

  追蹤一系列request的上傳進度

  這個例子中, myProgressIndicator是個 NSProgressIndicator, myQueue是個ASINetworkQueue.

  - (void)uploadSomethingFiveTimes:(NSURL *)url

  {

  [myQueue cancelAllOperations];

  [myQueue setUploadProgressDelegate:myProgressIndicator];

  [myQueue setDelegate:self];

  [myQueue setRequestDidFinishSelector:@selector(queueComplete:)];

  int i;

  for (i=0; i<5; i++) {

  ASIHTTPRequest *request = [ASIFormDataRequest requestWithURL:url];

  [request setPostBody:[@"Some data" dataUsingEncoding:NSUTF8StringEncoding]];

  [myQueue addOperation:request];

  }

  [myQueue go];

  }

  - (void)queueComplete:(ASINetworkQueue *)queue

  {

  NSLog(@"Max: %f, Value: %f", [myProgressIndicator maxValue],[myProgressIndicator doubleValue]);

  }

  精確進度條vs簡單進度條

  ASIHTTPRequest提供兩種進度條顯示,簡單進度條和精確進度條,使用ASIHTTPRequests 和ASINetworkQueues的showAccurateProgress 來控制。為一個request設定showAccurateProgress只會對該request有效。如果你為一個隊列設定showAccurateProgress,那麼會影響隊列裡所有的request。

  簡單進度條

  當使用簡單進度條時,進度條只會在一個request完成時才更新。對於單個request,這意味著你只有兩個進度狀態:0%和100%。對於一個有5個request的隊列來說,有五個狀態:0%,25%,50%,75%,100%,每個request完成時,進度條增長一次。

  簡單進度條(showAccurateProgress = NO)是ASINetworkQueue的預設值,適用於大量小資料請求。

  精確進度條

  當使用精確進度條時,每當位元組被上傳或下載時,進度條都會更新。它適用於上傳/下載大塊資料的請求,並且會更好的顯示已經發送/接收的資料量。

  使用精確進度條追蹤上傳會輕微降低介面效率,因為進度delegate(一般是UIProgressViews 或NSProgressIndicators)會更頻繁地重繪。

  使用精確進度條追蹤下載會更影響介面效率,因為隊列會先為每個GET型request進行HEAD請求,以便統計總下載量。強烈推薦對下載大檔案的隊列使用精確進度條,但是要避免對大量小資料請求使用精確進度條。

  精確進度條(showAccurateProgress = YES)是以同步方式執行的ASIHTTPRequest的預設值。

  自訂進度追蹤

  ASIProgressDelegate 協議定義了所有能更新一個request進度的方法。多數情況下,設定你的uploadProgressDelegate或者 downloadProgressDelegate為NSProgressIndicator或者UIProgressView會很好。但是,如果你想進行更複雜的追蹤,你的進度delegate實現下列函數要比 setProgress: (iOS) 或者 setDoubleValue: / setMaxValue: (Mac)好:

  這些函數允許你在實際量的資料被上傳或下載時更新進度,而非簡單方法的0到1之間的數字。

  downloadProgressDelegates方法

  request:didReceiveBytes: 每次request下載了更多資料時,這個函數會被調用(注意,這個函數與一般的代理實現的 request:didReceiveData:函數不同)。

  request:incrementDownloadSizeBy: 當下載的大小發生改變時,這個函數會被調用,傳入的參數是你需要增加的大小。這通常發生在request收到回應標頭並且找到下載大小時。

  uploadProgressDelegates方法

  request:didSendBytes: 每次request可以發送更多資料時,這個函數會被調用。注意:當一個request需要消除上傳進度時(通常是該request發送了一段資料,但是因為授權失敗或者其他什麼原因導致這段資料需要重發)這個函數會被傳入一個小於零的數字。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.