【发布时间】:2021-01-24 15:16:09
【问题描述】:
我需要下载大量文件 - 以前一次只能下载一个文件。当前的设计是,当用户下载单个文件时,会创建一个 URLSession 任务,并使用 urlsession 的委托方法记录进度/完成/失败。我的问题是,我怎样才能在这个委托方法中留下一个调度组?我需要一次下载 10 个文件,前 10 个完成后开始下 10 个。现在,如果我将调度组留在委托方法中,调度组将永远等待。以下是我目前实现的:
self.downloadAllDispatchQueue.async(execute: {
self.downloadAllDispatchGroup = DispatchGroup()
let maximumConcurrentDownloads: Int = 10
var concurrentDownloads = 0
for i in 0..<files.count
{
if self.cancelDownloadAll {
return
}
if concurrentDownloads >= maximumConcurrentDownloads{
self.downloadAllDispatchGroup.wait()
concurrentDownloads = 0
}
if let workVariantPart = libraryWorkVariantParts[i].workVariantPart {
concurrentDownloads += 1
self.downloadAllDispatchGroup.enter()
//call method for download
}
}
self.downloadAllDispatchGroup!.notify(queue: self.downloadAllDispatchQueue, execute: {
DispatchQueue.main.async {
}
})
})
在代表中:
func downloadDidFinish(_ notification: Notification){
if let dispatchGroup = self.downloadAllDispatchGroup {
self.downloadAllDispatchQueue.async(execute: {
dispatchGroup.leave()
})
}
}
这甚至可能吗?如果没有,我该如何实现?
【问题讨论】:
-
如果我要递归使用:II 会将下载数组分成最多 10 个组。然后我会创建一个
DispatchGroup,在第一个块上带有enter()、leave()、notify()。在notify()上,我会在块的其余部分调用方法本身。否则,(NS)Operation 也可能是一个解决方案。
标签: ios swift asynchronous grand-central-dispatch urlsession