【问题标题】:How to pause a task scheduled by DispatchQueue [duplicate]如何暂停 DispatchQueue 安排的任务 [重复]
【发布时间】:2018-04-04 00:24:37
【问题描述】:

我有一个游戏,我正在创建一个暂停按钮。暂停按钮需要停止然后恢复特定任务:

DispatchQueue.main.asyncAfter(deadline: .now() + delay, execute: {
        if self.ongoing {
            self.dispose()
        }
})

我正在考虑通过跟踪此任务的安排时间和暂停开始时间来执行此操作,这样我就可以在播放器取消暂停后安排一个具有更新时间的新任务。但是,我不知道如何取消旧任务。有没有更简单的方法可以暂时冻结/停止 DispatchQueue 安排的任务?

【问题讨论】:

  • 你没有suspend任务。你 suspend 私有队列,它阻止任何东西在该队列上启动(但对已经在该队列上运行的任务不做任何事情)。我很难想象将 GCD 队列用于您的用例。当然,如果您已经在使用队列来管理应用程序的状态(例如调度计时器),那很好,但我个人倾向于为此寻求非 GCD 解决方案。

标签: swift


【解决方案1】:

如果任务已经启动,最简单的方法是使用isCancelled 变量,您的任务代码会在其主循环内反复检查该变量。要取消任务,只需将isCancelled 变量设置为true。您可能想要使用锁和/或信号量来使变量线程安全。如果您使用OperationQueue 而不是DispatchQueue,则Operation 对象包含一个为此目的现成的isCancelled 操作(并且如果您设法在操作开​​始之前设置isCancelled 属性, OperationQueue 将完全跳过运行它)。

【讨论】:

  • 仅供参考,DispatchWorkItem 已经有一个 isCancelled 属性。然后,您可以 cancel DispatchWorkItem 并为您设置现有的 isCancelled 属性。
  • @Rob 非常好;我没有意识到这一点。
猜你喜欢
  • 1970-01-01
  • 2016-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多