方法是什么?NSTimer
文档是这样说的:
特殊注意事项
您必须从线程发送此消息 安装了计时器。如果您从其他人发送此消息 线程,则可能不会删除与计时器关联的输入源 从其运行循环,这可能会阻止线程退出 适当地。
由于GCD
不能保证串行队列将始终在同一线程上运行块,因此确保在同一线程上调度和使NSTimer
失效的正确方法是什么?
编辑:
按照以下答案的建议,我创建了MSWeakTimer
(https://github.com/mindsnacks/MSWeakTimer),这是一个自定义计时器实现,使用可从任何队列中使用的GCD
。
您不应在 GCD 管理的匿名工作线程上安装 NSTimer
。
将调度计时器源与 GCD 一起使用,而不是NSTimer
,参见 dispatch_source_create(3)。
NSTimer
依赖于当前线程的运行循环,这对于 GCD 队列没有意义。有关 GCD 和运行循环 API 的更多详细信息,请参阅 WWDC2012 GCD 会话。