queue - 在GCD队列,stop/cancel/suspend/resume 如何处理任务

  显示原文与译文双语对照的内容

如何 stop/cancel/suspend/resume 队列中的任务

如何停止后台队列操作? 我想在我们的应用程序中停止一些屏幕。 有些屏幕应该自动恢复。 那么,如何在iOS中传递一个队列?

当用户浏览应用程序时,我们在dispatch_queue_t中运行后台线程。 但它永远不会停止并在代码中继续。 那么如何挂起和恢复队列

时间: 原作者:

要挂起调度队列,只需在 objective-c 或者 Swift 中使用 dispatch_suspend(queue),或者在 Swift 3中使用 queue.suspend() 。 这不会影响当前正在运行的任务,但只阻止新任务从该队列启动。 此外,你显然只挂起了创建( 。不是全局队列,不是主队列)的队列。

若要恢复调度队列,则为 objective-c 或者 Swift 2.3中的dispatch_resume(queue),或者 Swift 3中的queue.resume() 。 没有"自动恢复"的概念,所以只要合适,你就必须手工恢复它。

通过在 objective-c 或者 Swift 中调用 dispatch_queue_t 对象,或者在 Swift 3中使用 DispatchQueue(label:) 创建的DispatchQueue 对象传递一个调度队列,从而传递调度队列。

在canceling队列canceling取消任务 In this iOS iOS iOS iOS and objective-c 或者 Swift 3中的dispatch_block_cancel(block) 对象或者 item.cancel() 调用。 这取消了排队的块/项目,但没有停止正在进行的操作。 如果希望中断调度块/项,则必须在 objective-c 和 Swift 2.3中定期检查 dispatch_block_testcancel(),或者在 Swift 3中的 item.isCancelled 中检查。

我可以通过 WWDC 2014视频强大的性能和诊断来帮助你取消GCD模块的canceling 在命令行对象中新增的内容,向你介绍调度块对象的概念,排队,取消它们,取消它们,同时,这些概念同样适用于最新的Swift 3 API 。

如果要取消任务,还可以考虑使用操作队列,objective-c 中的NSOperationQueue 或者 Swift 2.3,a.k. 。 因为它可以取消操作已经存在一段时间,而且你可能会发现许多在线示例,所以在 Swift 3中的OperationQueue 。 它还支持使用 maxConcurrentOperationCount ( 与调度队列一样,你只能在串行和并发之间进行选择,并且控制并发更多。) 约束并发度。

如果使用操作队列,则通过更改队列的suspended 属性来挂起和恢复。 要传递它,只需传递实例化的NSOperationQueue 对象。

我建议你扩展你的问题,以详细描述背景中运行的任务,并说明为什么要挂起它们。 可能有比挂起后台队列更好的方法。

在你的评论中,你提到你正在使用 NSTimer,a.k. 。 Swift 3中的Timer 。 如果要停止计时器,请调用 timer.invalidate() 停止它。 当你想再次启动时创建新的NSTimer

Or计时器真的在后台线程运行,GCD计时器,this,避免在后台线程上创建 runloop,需要在后台线程上运行 NSTimer 。 通过使用nntp定时器,你可以挂起/继续,就像挂起/恢复队列,而不是队列对象。

原作者:
...