首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >删除initiallyInactive队列

删除initiallyInactive队列
EN

Stack Overflow用户
提问于 2020-03-27 03:57:59
回答 1查看 131关注 0票数 1

我有一系列的照片需要下载,但下载功能一次只能下载一张照片。我需要确保下载函数已经完成,然后再调用它来获取其他照片。我创建了.initialyInactive DispatchQueue,并在下载功能的完成块中激活了队列。我是woking,正在下载照片,但我的问题是如何取消下载过程?我能以某种方式删除未激活的队列吗?

我的代码逻辑看起来像这样。

代码语言:javascript
运行
复制
 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 {
                          ...
                   }
           }
}

我的问题的其他解决方案也很好。谢谢。

EN

回答 1

Stack Overflow用户

发布于 2020-04-13 01:56:35

有几个选项:

  1. 过去我们会使用一个自定义的异步Operation子类。请参阅https://stackoverflow.com/a/38469350/1271826 (或参阅https://stackoverflow.com/a/48104095/1271826以了解备用AsynchronousOperation实现)。这给了我们一个可取消的操作,我们可以很容易地控制并发的程度。

如果您想一次下载一个,可以将队列的maxConcurrentOperationCount设置为1。然后,您可以将下载操作添加到单个OperationQueue,如果您想取消它们,可以调用queue.cancelAllOperations().

  1. 如果您的目标是iOS 13和更高版本,Combine会让这一切变得更容易。有关使用Combine (顺序以及concurrency).

的受控程度)下载一系列图像的示例,请参阅https://stackoverflow.com/a/61195234/1271826

话虽如此,我还是鼓励你重新考虑按顺序下载图片的选择。在我的random test中,将允许的最大并发数增加到6会导致下载速度总体上是串行行为的两倍。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60875215

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档