我是否需要使用NSTimer从陀螺仪iOS获取数据?

时间:2012-12-21 06:25:27

标签: objective-c ios nstimer gyroscope core-motion

现在我正在使用以下代码从设备的陀螺仪中获取Euler值。这是应该如何使用的?或者,如果没有使用NSTimer,还有更好的方法吗?

- (void)viewDidLoad {
[super viewDidLoad];
CMMotionManager *motionManger = [[CMMotionManager alloc] init];
[motionManger startDeviceMotionUpdates];

NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:(1/6) target:self selector:@selector(read) userInfo:nil repeats:YES];
}

- (void)read {
CMAttitude *attitude;
CMDeviceMotion *motion = motionManger.deviceMotion;
attitude = motion.attitude;
int yaw = attitude.yaw; 
}

2 个答案:

答案 0 :(得分:1)

你可以使用这个......

    [motionManager startDeviceMotionUpdatesToQueue:[NSOperationQueue currentQueue] withHandler:^(CMDeviceMotion *motion, NSError *error)
 {
     CMAttitude *attitude;
     attitude = motion.attitude;
     int yaw = attitude.yaw; 
 }];

答案 1 :(得分:1)

直接引用the documentation

  

以指定间隔处理动作更新

     

接收动作数据   在特定的时间间隔,应用程序调用一个“开始”方法,采取一个   操作队列(NSOperationQueue的实例)和块处理程序   用于处理这些更新的特定类型。运动数据是   传递给块处理程序。确定更新频率   通过“间隔”属性的值。

     

[...]

     

设备动作。设置要指定的deviceMotionUpdateInterval属性   更新间隔。打电话给或   startDeviceMotionUpdatesUsingReferenceFrame:toQueue:withHandler:或   startDeviceMotionUpdatesToQueue:withHandler:方法,传入一个   CMDeviceMotionHandler类型的块。用前一种方法(新的   iOS 5.0),您可以指定要用于的参考帧   态度估计。旋转速率数据作为传递到块中   CMDeviceMotion对象。

所以,例如。

motionManger.deviceMotionUpdateInterval = 1.0/6.0; // not 1/6; 1/6 = 0
[motionManager 
    startDeviceMotionUpdatesToQueue:[NSOperationQueue mainQueue]
    withHandler:
        ^(CMDeviceMotion *motion, NSError *error)
         {
             CMAttitude *attitude;
             attitude = motion.attitude;
             int yaw = attitude.yaw; 
         }];

我懒得使用主队列,但这仍然是比NSTimer更好的解决方案,因为它会给运动经理一个关于你多久更新的明确线索。