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

Jav*_*oto 9 objective-c core-foundation nstimer grand-central-dispatch ios

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

特别注意事项

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

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

编辑:

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

das*_*das 11

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

将调度计时器源与GCD一起使用,而不是使用dispatch_source_create NSTimer(3).

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