这样做的正确方法是什么? NSTimer
文档说明了这一点:
特别注意事项
您必须从线程发送此消息 定时器已安装。如果您从另一个发送此消息 线程,可能不会删除与计时器关联的输入源 从它的运行循环,这可以防止线程退出 正常。
由于GCD
不能保证串行队列总是在同一个线程上运行块,所以有什么方法可以确保在同一个线程上安排NSTimer
并使其无效?< / p>
修改
根据以下答案的建议,我创建了 MSWeakTimer
(https://github.com/mindsnacks/MSWeakTimer)这是一个使用GCD
的自定义计时器实现,可以在任何地方使用队列中。
答案 0 :(得分:11)
您不应在由GCD管理的匿名工作线程上安装NSTimer
。
使用GCD代替NSTimer
的调度计时器来源,c.f。 dispatch_source_create(3)。
NSTimer
依赖于当前线程的runloop,这对于GCD队列来说并不合适。有关GCD和runloop API的更多详细信息,请参阅WWDC2012 GCD会话。