如何在不使用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
的常用技术),但现在它已经过时了。这是一种低效的方法;反模式。