【问题标题】:how to use iOS accelerometer without UIAccelerometerDelegate如何在没有 UIAccelerometerDelegate 的情况下使用 iOS 加速度计
【发布时间】:2013-03-24 09:12:45
【问题描述】:

是否可以在不使用连续委托的情况下请求Accelerometer/Gyroscope 的值(例如使用UIAccelerometerDelegateCMMotionManager startGyroUpdatesToQueue 之类的东西)?我的意思是,我想只请求一次 xyz 的值,并且尽可能节省资源。

谢谢。

【问题讨论】:

  • 我不认为拥有一个委托对象会消耗太多资源。

标签: ios objective-c accelerometer gyroscope


【解决方案1】:

这应该可行。

CMMotionManager* motionManager = [[CMMotionManager alloc] init];
[motionManager startAccelerometerUpdates];
CMAccelerometerData* data = [motionManager accelerometerData];
while ( data.acceleration.x == 0 )
{
    data = [motionManager accelerometerData];
}
NSLog(@"x = %f, y = %f, z = %f.", data.acceleration.x, data.acceleration.y, data.acceleration.z);

这只是一个示例,说明您可以采取哪些措施来使事情顺利进行。在我看来,这是一个非常糟糕的主意,但如果你想完成它,它确实可以让事情发挥作用。

代码非常简单明了,您告诉CMMotionManager 开始从加速度计或陀螺仪检索数据,然后向它请求数据。这就是为什么它不好,更新有间隔,所以在前几毫秒,从CMMotionManager 检索到的数据是零值的。这就是 while 循环的用途。这种事情应该被卸载到另一个线程,这样UI就不会被阻塞,但是它比UIAccelerometerDelegate更消耗资源并且阻塞不会超过半秒。

【讨论】:

  • 谢谢。这是一段有趣的代码。为什么你认为,这个解决方案会比使用 UIAccelerometerDelegate 更消耗资源?连续使用 UIAccelerometerDelegate 进程...但是如果我每小时只需要 3 次坐标(由用户操作驱动的事件),那么您的代码 sn-p 似乎是更好的解决方案?!
  • 更多的资源消耗,我的意思是如果你试图把这个while循环卸载到一个单独的NSThread。此代码 sn-p 冻结 UI 半秒,这在旧设备上可能不是很好的体验。我没有这样的硬件来测试它,但我认为你应该在旧硬件上测试它。
【解决方案2】:

如果您每小时只需要 3 次数据,您可以使用

停止委托
accelerometer.delegate = nil;

这应该可以防止资源丢失(至少足以告诉系统您的应用目前不需要加速度计数据)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-22
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多