0

我使用 CMMotionManager 来访问 iOS 的陀螺仪数据。我看到有两种方法:

startGyroUpdates 
startGyroUpdatesToQueue:withHandler:

开始接收陀螺仪更新。我们如何区分调用这两种方法。可以调用其中任何一个的情况是什么?一个比另一个重要吗?

任何帮助表示赞赏,

4

2 回答 2

3

队列用于保证处理所有事件,即使您在deviceMotionUpdateInterval中设置的更新间隔以比您实时处理的速度更快的速度产生事件。如果您不介意丢失事件,则使用两者中的哪一个都没关系,只需丢弃它们即可。

相关的 Apple 文档是事件处理指南的核心运动部分:

对于上述每种数据运动类型,CMMotionManager 类提供了两种获取运动数据的方法,一种是推式方法,一种是拉式方法:

  • 推。应用程序请求更新间隔并实现一个块(特定类型)来处理运动数据;然后它开始更新该类型的运动数据,将操作队列和块传递给 Core Motion。Core Motion 将每个更新传递给块,该块作为操作队列中的任务执行。

  • 拉。应用程序开始更新一种运动数据并定期对运动数据的最新测量值进行采样。

对于大多数应用程序,尤其是游戏,推荐使用拉取方法;它通常更有效并且需要更少的代码。推送方法适用于不能错过样本测量的数据收集应用程序和类似应用程序。

这不是你的问题,但我想知道你是否想要原始的 x、y、z 旋转或更有用的俯仰、滚动、偏航。对于以后使用startDeviceMotionUpdatesToQueue:withHandler:代替startGyroUpdatesToQueue:withHandler:

于 2011-08-29T20:57:24.007 回答
1

编辑:请参阅汤米对此答案的评论。我对委托模式的假设是错误的。

我不是特别熟悉CMMotionManager,但从命名来看,这是我的猜测:

  • startGyroUpdates
    通过在主线程上调用委托方法来提供陀螺仪更新。
  • startGyroUpdatesToQueue:withHandler:
    通过调用给定队列上的处理程序块来提供陀螺仪更新。

第一个是使用委托的预块样式,第二个是基于 GCD 的块化版本。

于 2011-08-29T20:33:37.333 回答