2013-03-24 61 views
0

是否有可能在不使用连续委派的情况下请求Accelerometer/Gyroscope的值(如使用UIAccelerometerDelegate或类似CMMotionManager startGyroUpdatesToQueue)?我的意思是,我想要请求x,yz的值,只需要一次,并尽可能节约资源。如何在没有UIAccelerometerDelegate的情况下使用iOS加速度计

谢谢。

+0

我不认为有一个委托对象会花费太多的资源。 – 2013-03-24 09:21:23

回答

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更耗费资源,并且阻塞时间不会超过半秒。

+0

谢谢。这是一段有趣的代码。为什么你认为,这个解决方案比使用UIAccelerometerDelegate更耗资源?不断使用UIAccelerometerDelegate进程......但是如果我需要每小时3次的坐标(事件由用户操作驱动),那么比你的代码片段似乎是更好的解决方案?! – 2013-03-24 11:39:53

+0

更耗费资源,我的意思是如果你试图将这个while循环卸载到单独的NSThread。这段代码**会将用户界面冻结半秒钟,而在较旧的设备上,这可能不是那么棒的体验。我没有这样的硬件来测试它,但我认为你应该在旧硬件上测试它。 – 2013-03-24 13:32:40

0

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

accelerometer.delegate = nil; 

这应该防止资源损失(至少足以告诉系统你的应用程序做的不是需要加速计数据仅仅停留代表团瞬间)

相关问题