有条件地延迟队列有限时间

Delaying a queue for a finite time, conditionally

如何在不使用睡眠的情况下延迟后台队列的执行?此外,如果需要,我该如何打断该延迟?

RunLoop 的文档建议围绕函数 run 使用 while 循环,并在 while 循环中使用自定义条件。但是我该如何设置定时器来切换 while 循环执行呢?

您可以 suspend custom dispatch queues (but not global queues nor main queue). That stops new tasks from starting on that queue, but it does not affect things already running on that queue. You can resume 启动 运行 之前已分派到队列但尚未启动的项目。

GCD 还为 cancel a particular work item, and dispatch it again later when you want execution to resume. Note that cancel does not perform preemptive cancellation, but rather only sets a Boolean, isCancelled 提供了一种本机机制,您的分派任务需要定期检查并手动退出。

(如果你想取消队列上的任务,你可以考虑OperationQueue,因为它比调度队列有更优雅的取消能力。或者你可以考虑[=16=的“结构化并发” ]-await of Swift concurrency,也有取消 built-in。)


现在,虽然 GCD 没有“暂停”分派到后台线程的任务的概念,但您可以 jury-rig 非常小心地使用信号量来做一些事情。但细节会根据您的实施情况而有很大差异,因此如果没有更多细节,很难提供进一步的建议。


你问过:

The docs for RunLoop suggest a while loop around the function run with a custom condition in the while loop.

作为一般规则,应避免任何涉及 while 循环的旋转。这是一种非常低效的模式,应该避免。许多年前(例如,在 GCD 之前,在 URLSession 之前,等等),这种 spin-on-run-loop 模式并非闻所未闻(例如,它是 go-to 技术 运行 NSURLConnection 在后台线程上),但现在已经不合时宜了。这是一种低效的方法;一个 anti-pattern.