9

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

特别注意事项

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

既然GCD不能保证串行队列总是在同一个线程上运行块,那么确保您NSTimer在同一个线程上调度和无效的正确方法是什么?

编辑:

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

4

1 回答 1

11

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

使用带有 GCD 的调度计时器源而不是NSTimer,参见 dispatch_source_create(3)。

NSTimer依赖于当前线程的 runloop,这对于 GCD 队列来说是没有意义的。有关 GCD 和 runloop API 的更多详细信息,请参阅 WWDC2012 GCD 会议。

于 2013-02-02T01:29:02.663 回答