【发布时间】:2011-08-29 20:26:28
【问题描述】:
我使用 CMMotionManager 来访问 iOS 的陀螺仪数据。我看到有两种方法:
startGyroUpdates
startGyroUpdatesToQueue:withHandler:
开始接收陀螺仪更新。我们如何区分调用这两种方法。可以调用其中任何一个的情况是什么?一个比另一个重要吗?
任何帮助表示赞赏,
【问题讨论】:
我使用 CMMotionManager 来访问 iOS 的陀螺仪数据。我看到有两种方法:
startGyroUpdates
startGyroUpdatesToQueue:withHandler:
开始接收陀螺仪更新。我们如何区分调用这两种方法。可以调用其中任何一个的情况是什么?一个比另一个重要吗?
任何帮助表示赞赏,
【问题讨论】:
队列用于保证处理所有事件,即使您在deviceMotionUpdateInterval 中设置的更新间隔以比您实时处理的速度更快的速度产生事件。如果您不介意错过事件,则使用两者中的哪一个都没关系,只需丢弃它们即可。
相关的 Apple 文档是事件处理指南的 Core Motion 部分:
对于上述每种数据运动类型,CMMotionManager 类提供了两种获取运动数据的方法,一种是推送方法 和拉式方法:
推。应用程序请求更新间隔并实现 用于处理运动数据的块(特定类型);然后 开始更新该类型的运动数据,传递给 Core Motion 操作队列和块。 Core Motion 提供每个 更新到块,它作为操作队列中的任务执行。
拉。应用程序开始更新一种运动数据,并 定期对运动数据的最新测量值进行采样。
对于大多数应用程序来说,拉取方法是推荐的方法, 尤其是游戏;它通常更有效,需要更少 代码。推送方法适用于数据收集 不能错过样本的应用程序和类似应用程序 测量。
这不是你的问题,但我想知道你是否想要原始的 x、y、z 旋转或更有用的俯仰、滚动、偏航。对于以后使用startDeviceMotionUpdatesToQueue:withHandler: 而不是startGyroUpdatesToQueue:withHandler:。
【讨论】:
编辑:请参阅 Tommy 对此答案的评论。我对委托模式的假设是错误的。
我对@987654321@不是特别熟悉,但从命名来看,这是我的猜测:
startGyroUpdatesstartGyroUpdatesToQueue:withHandler:第一种是使用委托的预块样式,第二种是基于 GCD 的块化版本。
【讨论】:
startGyroUpdates 适合那些想要经常检查状态的人,而不是那些想要接收实时更新的人。因此,这也是一个线索,表明 Apple 可能会将代表视为一个传统想法。