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座標を追跡しながら、携帯電話を下に傾けるたびに1回だけアクションを呼び出す方法を知っている人はいますか?

4

2 に答える 2

1

マルチスレッドを使用して、GCD のdispatch_async. 次の例では、バックグラウンド スレッドでデータをサンプリングしますが、20 サンプルごとに 1 回だけ 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 に答える