lak*_*bob 27 queue grand-central-dispatch ios
如何在GCD队列上停止/取消/暂停/恢复任务
如何停止后台队列操作?我想在我们的应用程序中停止一些屏幕.有些屏幕应该是自动恢复.那么,如何在iOS中传递队列?
我的意思是当用户浏览应用程序时,我们在dispatch_queue_t中运行后台线程.但它永远不会停止并在代码中恢复.那么如何暂停和恢复队列
Rob*_*Rob 55
要暂停一个调度队列,它只是dispatch_suspend(queue)在Objective-C或Swift 2.3或queue.suspend()Swift 3中.这不会影响当前正在运行的任何任务,而只是阻止新任务在该队列上启动.此外,您显然只挂起您创建的队列(不是全局队列,而不是主队列).
要恢复调度队列,它dispatch_resume(queue)在Objective-C或Swift 2.3或queue.resume()Swift 3中.没有"自动恢复"的概念,因此您只需在适当的时候手动恢复它.
要传递调度队列,只需传递在Objective-C或Swift 2.3中dispatch_queue_t调用时创建的对象dispatch_queue_create(),或者在Swift 3中传递您创建的DispatchQueue对象DispatchQueue(label:).
在取消任务而言排队的调度队列,这是针对iOS 8的新功能,你会叫dispatch_block_cancel(block)你dispatch_block_t在Objective-C的对象或雨燕2.3,或item.cancel()的DispatchWorkItem斯威夫特3.这将取消排队有没有块/项目开始了,但不会阻止那些正在进行的.如果您希望能够中断调度的块/项,则必须定期检查dispatch_block_testcancel()Objective-C和Swift 2.3,或item.isCancelledSwift 3.
取消GCD块非常复杂,我可能会向您推荐WWDC 2014视频电源,性能和诊断:GCD和XPC中的新功能,它向您介绍调度块对象的概念,排队,取消它们等.虽然这是描述旧的Objective-C和Swift 2.3 API,但所有概念同样适用于较新的Swift 3 API.
如果你想取消任务,你也可以考虑NSOperationQueue在Objective-C或Swift 3中使用操作队列,也就是OperationQueue在Swift 3中,因为它的可取消操作已经存在了一段时间,你可能会在网上找到很多例子.它还支持约束并发度maxConcurrentOperationCount(对于调度队列,您只能在串行和并发之间进行选择,并且控制并发性不仅需要您做出一点努力).
如果使用操作队列,则通过更改suspended队列的属性来暂停和继续.传递它,你只需传递NSOperationQueue你实例化的对象.
说完所有这些之后,我建议你扩展你的问题,详细说明后台运行什么类型的任务,并阐明你想要暂停它们的原因.可能有比挂起后台队列更好的方法.
在你的评论中,你提到你正在使用NSTimer,也就是Timer在Swift 3中.如果你想停止计时器,请致电timer.invalidate()停止它.NSTimer如果要再次启动它,请创建一个新的.
或者如果计时器确实在后台线程上运行,GCD计时器可以更加优雅地执行此操作,避免了需要NSTimer在后台线程上创建runloop的愚蠢,后台线程需要在后台线程上运行.使用GCD计时器,您可以暂停/恢复它,就像暂停/恢复队列一样,只需使用计时器对象而不是队列对象.
使用 GCD 队列时无法暂停/取消。如果您需要该功能(在很多一般情况下,即使您不需要),您应该使用更高级别的 API - NSOperationQueue. 这是建立在 GCD 之上的,但它使您能够控制同时执行的事物数量、暂停队列处理以及取消单个/所有操作。
| 归档时间: |
|
| 查看次数: |
25093 次 |
| 最近记录: |