Chcę pobrać kilka plików, na przykład 100 plików w tym samym czasie. Dlatego postanowiłem dodać wątki pobierania do kolejki wysyłkowej, a GCD dostosuje liczbę wątków uruchomionych w tym samym czasie.Oczekiwanie na wiele asynchronicznych zadań pobierania
Problem tutaj: blok w dispatch_async
zostanie zakończony natychmiast, ponieważ task
będzie działać na innym wątku. Tak więc, jeśli urls
ma długość 100, natychmiast utworzy 100 wątków.
var queueDownloadTask = dispatch_queue_create("downloadQueue", nil)
for url in urls {
dispatch_async(queueDownloadTask) {
let config = NSURLSessionConfiguration.defaultSessionConfiguration()
let fileTransferSession = NSURLSession(configuration: config)
let task = fileTransferSession.downloadTaskWithURL(url, completionHandler: { (responseUrl, response, error) -> Void in
println("completed")
})
task.resume()
}
}
Jak mogę skonfigurować blok w dispatch_async
czekać na pobieranie, aby zakończyć zadanie? Nie chcę używać dispatch_semaphore
, ponieważ pozwala on tylko uruchomić jedno zadanie pobierania w tym samym czasie.
Myślę, że to jest poprawna odpowiedź. Dodatkowo użycie osobnej kolejki do planowania zadań (takich jak 'queueDownloadTask') jest niepotrzebne, ponieważ' task.resume() 'zwraca się natychmiast. Wystarczy użyć głównej kolejki, aby je zaplanować. – Fujia
Prawda. Ja też bym to polecił. – jtbandes