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