2013-02-12 391 views
0

我喜歡在應用獲取新聞和視頻時顯示加載消息。目前,我有以下代碼:等待多個異步任務完成

[MBProgressHUD showHUDAddedTo:self.view animated:YES]; 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{ 

     [self loadVersion]; 
     [self loadFeaturedNews]; 
     [self loadFeaturedVideo]; 

     dispatch_async(dispatch_get_main_queue(), ^{ 

      [MBProgressHUD hideHUDForView:self.view animated:YES]; 

      [self dismissViewControllerAnimated:NO completion:nil]; 

     }); 
    }); 

我想辭退控制器和隱藏,只有當所有任務(新聞,視頻)被加載進度視圖。

回答

1

後要執行,你可能想看看enqueueBatchOfHTTPRequestOperations。我會推薦你​​到AFNetworking FAQ

我如何等待一組請求完成處理之前?

使用[enqueueBatchOfHTTPRequestOperationsWithRequests]或[enqueueBatchOfHTTPRequestOperations]將一系列請求一起批處理,指定所有請求完成時的回調。如等待完成塊完成的問題中所述,您可能不希望爲每個單獨的操作設置完成塊,而是直接在批量完成塊中訪問響應對象屬性。


我推測,loadVersionloadFeaturedNewsloadFeaturedVideo方法均爲異步下載內容。如果您使用NSURLConnection,我會建議將它們更改爲同步操作。解決方案的細節取決於你當前如何在這些例程中下載東西,例如如果您使用NSURLConnection方法,initWithRequest,則可以使用sendSynchronousRequest

就我個人而言,我傾向於將它與請求調度組或NSOperationQueue依賴關係同時執行請求結合起來,但首先關注讓它們同步運行。我實際上使用了NSOperationQueue,所以我可以輕鬆地將併發操作的數量限制爲四個,或者這樣的合理的東西。

順便說一句,我不建議你改變你的問題中的代碼。保持dispatch_async。我建議您將loadVersionloadFeaturedNewsloadFeaturedVideo方法本身修復爲同步操作。

+0

我正在使用AFNetworking,但我可以嘗試同步撥打電話! – azamsharp 2013-02-12 18:59:05

+1

@azamsharp在這種情況下,我可能會收回我的評論,並建議您查看「AFNetworking」[FAQ](https:// github。com/AFNetworking/AFNetworking/wiki/AFNetworking-FAQ),其標題爲「在處理它們之前如何等待一組請求完成?」。 – Rob 2013-02-12 19:23:23

0

然後使用完成處理程序爲此。在你可以寫你的代碼是如果你使用AFNetworking完成

completion:^ (BOOL finished) { 

    } 
+0

如果有10個任務,並且我想確保所有10個任務都完成,那麼它將涉及10個完成處理程序。 – azamsharp 2013-02-12 18:15:08

+0

你可以在單個處理程序中包含這10個任務 – 2013-02-12 18:18:38

+0

dispatch_async沒有完成處理程序 – azamsharp 2013-02-12 18:19:21