使用Accelerometer只调用一次void

时间:2013-05-31 23:09:03

标签: ios objective-c

我设置了代码,因此我的应用程序不断循环加速度计数据以确定手机的位置。我希望能够获取手机的Z坐标并根据它们调用操作。

现在我有这个:

if (.3 > filter.z && filter.z > -.3){
        NSLog(@"STRAIGHT = %f", filter.z);


    }
    else if (1.3 > filter.z && filter.z > .7){
        NSLog(@"DOWN = %f", filter.z);
         [self performSelector:@selector(loadNextFlag) withObject:nil
                  afterDelay:1.0];
    }
    else if (-.4 > filter.z && filter.z > -1.3){
          NSLog(@"UP = %f", filter.z);
    }

此代码有效。它知道手机的朝向,并正确记录信息。什么不起作用是performSelector。由于加速度计在我向下倾斜手机时不断刷新其坐标信息,因此在几秒钟内调用performSelector动作很多次,导致应用程序崩溃。有没有人知道我每次向下倾斜手机时只能调用一次动作的方法,同时仍然跟踪Z坐标。

2 个答案:

答案 0 :(得分:1)

您可以使用多线程来跟踪更改,同时使用GCD的dispatch_async每隔一段时间更新主要(或任何其他)主题。在下面的示例中,您将在后台线程上对数据进行采样,但每20个样本只调用一次loadNextFlag:

__block int sampleCount = 0;

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, NULL), ^{
    if (.3 > filter.z && filter.z > -.3){
        NSLog(@"STRAIGHT = %f", filter.z);


    }
    else if (1.3 > filter.z && filter.z > .7){
        NSLog(@"DOWN = %f", filter.z);
        if (sampleCount >= 20) {
            sampleCount = 0;
            dispatch_async(dispatch_get_main_queue(), ^{
                [self loadNextFlag];
            });
        } else {
            sampleCount++;
        }
    }
    else if (-.4 > filter.z && filter.z > -1.3){
        NSLog(@"UP = %f", filter.z);
    }

});

答案 1 :(得分:0)

这就是我的工作方式。我添加了一个名为:

的布尔值
BOOl isPaused;

这让我只能在每次向下倾斜手机的时候拨打电话。像这样:

 if (.3 > filter.z && filter.z > -.3){
        NSLog(@"STRAIGHT = %f", filter.z);
        isPaused = NO;

    }
    else if (1.3 > filter.z && filter.z > .7 && !isPaused){
        NSLog(@"DOWN = %f", filter.z);
        [self performSelector:@selector(submitGuess:) withObject:nil
                  afterDelay:0.2];
        isPaused = YES;
    }
    else if (-.4 > filter.z && filter.z > -1.3){
          NSLog(@"UP = %f", filter.z);
    }
}