我有一系列的照片需要下载,但下载功能一次只能下载一张照片。我需要确保下载函数已经完成,然后再调用它来获取其他照片。我创建了.initialyInactive DispatchQueue,并在下载功能的完成块中激活了队列。我是woking,正在下载照片,但我的问题是如何取消下载过程?我能以某种方式删除未激活的队列吗?
我的代码逻辑看起来像这样。
func downloadPhoto(photo: Photo, completion: (_ success: Bool) -> Void) {
... completion(true) ..
}
for photo in photos {
let queue = DispatchQueue(label: "Download queue\(counter)", qos: .userInitiated, attributes: .initiallyInactive)
self.inactiveQueues[counter] = queue
queue.async {
self.downloadPhoto(photo: photo) { (success) in
nextQueue?.activate()
if success {
...
} else {
...
}
}
}
我的问题的其他解决方案也很好。谢谢。
发布于 2020-04-13 01:56:35
有几个选项:
Operation
子类。请参阅https://stackoverflow.com/a/38469350/1271826 (或参阅https://stackoverflow.com/a/48104095/1271826以了解备用AsynchronousOperation
实现)。这给了我们一个可取消的操作,我们可以很容易地控制并发的程度。如果您想一次下载一个,可以将队列的maxConcurrentOperationCount
设置为1。然后,您可以将下载操作添加到单个OperationQueue
,如果您想取消它们,可以调用queue.cancelAllOperations()
.
的受控程度)下载一系列图像的示例,请参阅https://stackoverflow.com/a/61195234/1271826
话虽如此,我还是鼓励你重新考虑按顺序下载图片的选择。在我的random test中,将允许的最大并发数增加到6会导致下载速度总体上是串行行为的两倍。
https://stackoverflow.com/questions/60875215
复制相似问题