【问题标题】:Is it possible to create multiple DispatchQueue?是否可以创建多个 DispatchQueue?
【发布时间】:2023-04-09 13:02:01
【问题描述】:

我对@9​​87654323@ 的东西(包括 DispatchGroups、Qos 等)不太熟悉。我现在有一个担忧。 就像,我有一个 ViewController 可用于 Android 的 ViewPager UI。在那个 VC 中,我有一个 TableView 每次更改 ViewPager 中的“页面”时都会重新加载。 我在 TableView 单元格中有一个 favourite button 属性。当用户点击该按钮时,它会存储通话后所需的信息 (JSON)。 我想在viewWillDisappear 运行时拨打电话。在那里,我想为每个“页面”创建后台线程并捕获已经创建的线程,以防用户点击一个“页面”,由于任何原因,post 调用无法达到高潮。 这是我在课堂上的内容:

var workItem1: DispatchWorkItem!
var dispatch1: DispatchQueue!

override func viewWillDisappear(_ animated: Bool) {
     super.viewWillDisappear(animated)
}

我应该怎么做才能实现我的目标?

【问题讨论】:

  • 我是否理解正确,您只需要多个队列以防一个调用引发异常?
  • 根本不需要排队。 URLSession 已经是异步的。队列不是线程。如果您习惯于线程编程,请参阅 Apple 的关于迁移到队列的指南,这是一种不同的思考问题的方式。 (尽管如此,这里不需要队列;URLSession 已经有自己的队列来为您管理。)developer.apple.com/library/archive/documentation/General/…
  • 另请参阅developer.apple.com/documentation/foundation/url_loading_system,了解有关 URLSession 的介绍以及如何考虑它。它是一个异步系统;无需创建新的线程或队列来管理它(您通常不应该这样做)。
  • @TMob 这有点偏。我真的不想要 很多 个队列,但我希望队列能够控制它们并终止或暂停,以防我需要在已创建的 API 调用返回一些响应之前进行另一个 API 调用。
  • 我需要关于 URLSessionqueues 的指导。我发现我理解线程的整个概念是错误的。我担心的是我想控制线程并终止或挂起,以防我需要在已经创建的 API 调用返回一些响应之前进行另一个 API 调用。

标签: ios swift4 grand-central-dispatch dispatch-queue


【解决方案1】:

理论上,您可以根据需要创建任意数量的队列。您还可以在串行队列(任务一个接一个地处理)或并发队列(任务同时处理)之间进行选择

let concurrentQueue = DispatchQueue(label: "my_queue_1", attributes: .concurrent)
concurrentQueue.sync {
    //do your thing
}  

但是:为每个呼叫创建一个队列是不好的做法。那不是队列的用途。你应该做的是使用并发队列,其中每个任务都代表一个 POST 调用。

或者更好的是,您应该问自己是否不能一次将用户收藏的所有页面的数组提交到服务器。这将在一定程度上消除排队的需要。

【讨论】:

  • 感谢您的回答!但在这种情况下,我为每个页面使用相同的 viewController,因为它们都需要相同的 UI 结构。因此我不能一起提交所有这些。 Page A 有 5 个项目,Page B 有 3 个项目。我在Page A 上,我跳过Page B 并转到Page D。因此,viewWillAppear 中调用的所有任务将继续运行直到完成。如果我没有查看相应的页面,我想停止对suspendcancel 执行任务或其中一些任务。就是这样。
  • 暂停已经运行的任务是可能的,但很烦人。问题是你为什么要暂停它们?这只是性能问题还是您的应用程序逻辑依赖于不发送这些请求?
  • 我的应用程序不依赖它。我认为这将是优化性能的好方法。因为提供 ViewPager UI 的 pod 文件在性能方面并不那么方便。就像,如果我直接从 Page A 滚动到 Page E,则会为从 A 到 E 的所有页面调用 viewWillAppear。因此 API 的结果对页面 B、C、D 的调用将被丢弃而未使用。这让我很恼火。所以,我想得到指导。更多关于这个话题。 在这种情况下,我应该怎么做才能最大限度地减少内存和互联网使用量? 谢谢!
猜你喜欢
  • 1970-01-01
  • 2015-03-17
  • 1970-01-01
  • 2013-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-15
相关资源
最近更新 更多