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

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

特别注意事项

您必须从安装了计时器的线程发送此消息。 如果从另一个线程发送此消息,则可能无法从其运行循环中删除与计时器关联的输入源,这可能会阻止线程正常退出。

由于GCD不能保证串行队列总是在同一个线程上运行块,因此确保在同一线程上安排和使NSTimer无效的正确方法是什么?

编辑:

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

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

使用调度计时器源与GCD而不是NSTimer ,cf dispatch_source_create(3)。

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