我有一组照片需要下载,但下载功能一次只能下载一张照片。我需要确保下载功能已经完成,然后再调用它来获取其他照片。我创建了.initialInactiveDispatchQueue,队列在下载功能的完成块中被激活。这是令人惊叹的,照片是下载的,但我的问题是如何取消下载过程?我可以以某种方式删除未激活的队列吗
我的代码逻辑看起来像这样。。
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 {
...
}
}
}
蚂蚁对我问题的另一个解决方案也很棒。谢谢
有几个选项:
-
历史上,我们使用自定义的异步
Operation
子类。看见https://stackoverflow.com/a/38469350/1271826(或参见https://stackoverflow.com/a/48104095/1271826用于替代AsynchronousOperation
实现(。这给了我们一个可取消的操作,我们可以很容易地控制并发的程度。如果您想一次下载一个,可以将队列的
maxConcurrentOperationCount
设置为1。然后,您可以将下载操作添加到单个OperationQueue
中,如果您想取消这些操作,您可以调用queue.cancelAllOperations()
。 -
如果你的目标是iOS 13及更高版本,Combine会让你更轻松。看见https://stackoverflow.com/a/61195234/1271826例如,使用Combine下载一系列图像(既有顺序的,也有受控的并发度(。
所有这些都已经说过了,我鼓励您重新考虑按顺序下载图像的选择。在我的随机测试中,将允许的最大并发量增加到6导致下载速度是串行行为的两倍。