2

-(void)メソッドが実行されていて、ある時点で、加速度計から値を要求された瞬間に直接取得するwhileループに到達します。

NSTimerクラスに関するドキュメントをすべて調べましたが、私の場合、このオブジェクトをどの程度正確に使用するのか理解できませんでした。

例えば

-(void) play
{
    ......
    ...



    if(accelerationOnYaxis >0 && accelerationOnYaxis < 0.9 )
    {
        startTimer;
    }

    while(accelerationOnYaxis >0 && accelerationOnYaxis < 0.9)
    {
        if(checkTimer >= 300msec)
        {

           printOut_AccelerationStayedBetweenThoseTwoValuesForAtLeast300msecs;
           break_Out_Of_This_Loop;
        }

    }

    stopTimerAndReSetTimerToZero;

    .....
    more code...
    ....
    ...
}

何か助けはありますか?

4

2 に答える 2

3

NSTimer起動するにはコードを終了する必要があるため、 では実行できません。NSTimerイベント ループを使用して、コールバックするタイミングを決定します。プログラムがwhileループ内でコントロールを保持している場合、起動する時間かどうかをチェックするコードに到達しないため、タイマーが起動する方法はありません。

その上、ビジー ループに 1 秒半近く留まると、バッテリーが消耗します。を単に待つ必要がある場合は、次のように1.4sを呼び出した方がよいでしょう。sleepForTimeInterval:

[NSThread sleepForTimeInterval:1.4];

clock()fromを使用し<time.h>て、次のように短い時間間隔を測定することもできます。

clock_t start = clock();
clock_t end = start + (3*CLOCKS_PER_SEC)/10; // 300 ms == 3/10 s
while(accelerationOnYaxis >0 && accelerationOnYaxis < 0.9)
{
    if(clock() >= end)
    {
       printOut_AccelerationStayedBetweenThoseTwoValuesForAtLeast300msecs;
       break_Out_Of_This_Loop;
    }

}
于 2012-07-30T20:04:01.860 に答える
1

NSTimerあなたが望むものとは少し異なります。必要なのは、ループ回数を取得するためのタイマーのカウンターです。カウンターが 14 になった場合 (整数の場合)、無効にすることができます。

//start timer
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:0.1
        target:self
        selector:@selector(play:)
        userInfo:nil
        repeats:YES];

//stop timer
[timer invalidate];

それがなくても関数を作成できます。

- (void)play {
    ......
    ...


    counter++; //declare it in your header

    if(counter < 14){
        x++; //your integer needs to be declared in your header to keep it's value
    } else {
        [timer invalidate];
    }

    useValueofX;
}

ドキュメントを見てください。

于 2012-07-30T20:03:35.503 に答える