【问题标题】:Is it safe to schedule and invalidate NSTimers on a GCD serial queue?在 GCD 串行队列上调度和使 NSTimers 无效是否安全?
【发布时间】:2013-02-01 19:52:46
【问题描述】:

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

特殊注意事项

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

由于GCD 不能保证串行队列总是在同一个线程上运行块,那么确保在同一个线程上安排NSTimer 并使NSTimer 无效的正确方法是什么?

编辑:

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

【问题讨论】:

  • +1 for MSWeakTimer...解决了我们可怕的内存问题!

标签: ios objective-c nstimer grand-central-dispatch core-foundation


【解决方案1】:

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

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

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

【讨论】:

  • 这很有意义。我想唯一的例外是主队列,对吗?
  • 正确,只要进程不调用dispatch_main(3),主runloop和主队列就绑定在一起,保证在主线程上执行。
猜你喜欢
  • 2021-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-17
  • 1970-01-01
  • 2022-08-23
  • 1970-01-01
  • 2021-11-17
相关资源
最近更新 更多