2012-04-09 88 views
0

我試圖從遠程下載文件,我現在可以監控每一個文件下載成功狀態AFNetworking監控所有的下載進程

[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { 

但是,任何方式監測下載的全過程?我應該如何知道所有下載都已完成?

我試着開始下載請求與

[afhttpClient enqueueBatchOfHTTPRequestOperations:operationArray 
               progressBlock:progressBlock 
              completionBlock:completionBlock]; 

似乎無法工作,所以什麼上面的代碼,並開始與[操作開始在一個循環下載請求之間的區別?

@mattt(如果你能看到這一點)

+0

@mattt(如果你能看到這一點) – 2012-04-09 11:20:22

回答

2

你最有可能有您用來下載圖像的URL對象的一個​​NSArray。你需要做的是創建一個整數值等於你的URL對象的數量。每次成功下載圖像或完全無法下載圖像時(例如在超時或超時後收到404 HTTP狀態碼),您需要遞減該整數(注意,它應該是一個原子屬性,因爲塊在不同的時間執行線程)。一旦計數達到零 - 所有請求都完成了。您也可以使用該整數來更新進度欄,或者僅通知用戶「#/ 15圖像已下載」。讓我知道你是否需要其他澄清。

不幸的是我沒有與AFHTTPClient一起工作,所以我不能準確地告訴你兩種操作之間的區別,但是從上下文來看,首先幾乎同時執行所有請求,而後者則使用連續方法,第二次請求將只在第一次請求完成時啓動。

0

您可以創建NSOperationQueue並將所有AFHTTPRequestOperation放入其中。 使用KVO觀察「操作」。當計數變爲零時,這是說完成所有操作的時間。

+0

的'enqueueBatchOfHTTPRequestOperations:... ...:'以上方法做幾乎完全有什麼建議,但使用GCD調度組的方法。當每個排隊操作完成時,它會觸發一個計算總計完成的塊,然後以此爲參數調用您的'progressBlock'。如果你有興趣,你應該看一下AFHTTPClient.m的'enqueueBatchOfHTTPRequestOperations:progressBlock:completionBLock'的實現......它寫得很好(現代)。 – 2012-12-20 15:01:04

0

如果你想要的是每個操作的字節下載和總預期的持續進度更新,那麼我可以強烈推薦Peter Steinberger的AFDownloadRequestOperation

該類派生自AFHTTPRequestOperation,並且在操作隊列級別添加了每個操作的progressiveDownloadProgressBlock,而不僅僅是操作隊列級別的每個操作完成進度,這是我認爲您正在尋找的。另一個巨大的好處是,它使可恢復/部分下載比在覈心AFNetworking實現中更容易訪問。

正是這種容易使用(從GitHub的項目的README.md爲例):

[pdfRequest setProgressiveDownloadProgressBlock:^(NSInteger bytesRead, 
      long long totalBytesRead, long long totalBytesExpected, 
      long long totalBytesReadForFile, long long totalBytesExpectedToReadForFile) 
{ 
    self.downloadProgress = totalBytesReadForFile/(float)totalBytesExpectedToReadForFile; 
}]; 

我用這幾個企業的iOS項目下載多GB的文件,我可以告訴你,它的工作原理非常適合AFNetworking的1.0.1版本。

希望幫助...