我想同时下载一些文件,例如100个文件。因此,我决定将下载线程添加到调度队列中,GCD会调整同时运行多少个线程。
这里的问题是:中的块dispatch_async将立即完成,因为task它将在另一个线程上运行。因此,如果urls长度为100,它将立即创建100个线程。
dispatch_async
task
urls
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() } }
如何配置块dispatch_async以等待下载任务完成?我不想使用dispatch_semaphore,因为它只允许同时运行一个下载任务。
dispatch_semaphore
要扩展Abhinav的答案,您应该:
dispatch_group_create()
dispatch_group_enter(group)
dispatch_group_leave(group)
dispatch_group_notify(group, queue, ^{ ... })
您可以在本文中看到一个示例。
(顺便说一句,dispatch_async连续执行100 s不会立即创建100个线程。系统仍然保留对使用多少线程来满足队列的控制权。但是,您的代码不会等待任何任务执行在返回之前完成,也不会尝试在完成的多个任务之间进行同步。)