在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会话。