一尘不染

等待多个异步下载任务

swift

我想同时下载一些文件,例如100个文件。因此,我决定将下载线程添加到调度队列中,GCD会调整同时运行多少个线程。

这里的问题是:中的块dispatch_async将立即完成,因为task它将在另一个线程上运行。因此,如果urls长度为100,它将立即创建100个线程。

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,因为它只允许同时运行一个下载任务。


阅读 197

收藏
2020-07-07

共1个答案

一尘不染

要扩展Abhinav的答案,您应该:

  1. 使用dispatch_group_create()创建一个组。
  2. dispatch_group_enter(group)在开始每个下载任务之前先致电。
  3. dispatch_group_leave(group)在任务的完成处理程序中调用。
  4. 然后调用dispatch_group_notify(group, queue, ^{ ... })排队将在所有任务完成时执行的块。

您可以在本文中看到一个示例。

(顺便说一句,dispatch_async连续执行100
s不会立即创建100个线程。系统仍然保留对使用多少线程来满足队列的控制权。但是,您的代码不会等待任何任务执行在返回之前完成,也不会尝试在完成的多个任务之间进行同步。)

2020-07-07