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



如何在不使用sleep的情况下延迟后台队列的执行?此外,如果需要的话,我该如何中断这种延迟呢?

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

您可以自定义suspend调度队列(但不包括全局队列和主队列)。这将阻止新任务在该队列上启动,但不会影响该队列上已经运行的任务。您可以使用resume来开始运行先前已分派到队列中但尚未启动的项目。

GCD还为cancel特定的工作项提供了一种本地机制,并在您想要恢复执行时再次调度它。注意cancel不执行抢占式取消,而只是设置一个布尔值isCancelled,您的分派任务需要定期检查并手动退出。

(如果您想取消队列上的任务,您可以考虑OperationQueue,因为它具有比调度队列更优雅的取消功能。或者你可以考虑Swift并发的async-await的"结构化并发",它也内置了取消功能。


现在,虽然GCD没有"挂起"分配给后台线程的任务的概念,但您可以通过非常小心地使用信号量来临时使用某些东西。但是具体细节会根据你们的实现而有很大的不同,所以在没有更多细节的情况下很难给出进一步的建议。


你问:

RunLoop的文档建议在run函数周围使用while循环,并在while循环中使用自定义条件。

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

相关内容

  • 没有找到相关文章

最新更新