在GCD串行队列上安排和使NSTimers无效是否安全?

时间:2013-02-01 19:52:46

标签: ios objective-c nstimer grand-central-dispatch core-foundation

这样做的正确方法是什么? NSTimer文档说明了这一点:

  

特别注意事项

     

您必须从线程发送此消息   定时器已安装。如果您从另一个发送此消息   线程,可能不会删除与计时器关联的输入源   从它的运行循环,这可以防止线程退出   正常。

由于GCD不能保证串行队列总是在同一个线程上运行块,所以有什么方法可以确保在同一个线程上安排NSTimer并使其无效?< / p>

修改

根据以下答案的建议,我创建了 MSWeakTimer https://github.com/mindsnacks/MSWeakTimer)这是一个使用GCD的自定义计时器实现,可以在任何地方使用队列中。

1 个答案:

答案 0 :(得分:11)

您不应在由GCD管理的匿名工作线程上安装NSTimer

使用GCD代替NSTimer的调度计时器来源,c.f。 dispatch_source_create(3)。

NSTimer依赖于当前线程的runloop,这对于GCD队列来说并不合适。有关GCD和runloop API的更多详细信息,请参阅WWDC2012 GCD会话。