0

我设置了代码,因此我的应用程序不断循环通过加速度计数据以确定手机所在的位置。我希望能够获取手机的 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 坐标的方法。

4

2 回答 2

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);
    }

});
于 2013-05-31T23:13:35.953 回答
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);
    }
}
于 2013-05-31T23:28:08.303 回答