iPhone加速度計:DidAccelerate:ループを実行している間は呼ばれないようです

StackOverflow https://stackoverflow.com/questions/2688224

質問

加速度計関連の質問。 (申し訳ありませんが、フォーマットは正しく見えないかもしれません。このサイトを初めて使用するのは初めてです)。標準コードを使用してアクセルメーターが期待どおりに機能しました

UIAccelerometer *accel = [UIAccelerometer sharedAccelerometer];
accel.delegate = self;
accel.updateInterval = 0.1;   //I also tried other update values

nslogを使用して、アクセルメーター:didaccelerate:メソッドが呼び出されるたびにログを記録します。この関数は期待どおりに呼び出され、すべてがここまで正常に機能します。

ただし、ループを実行すると、上記の方法が呼び出されないようです。このようなもの

float firstAccelValue = globalAccel; //this is the x-accel value (stored in a global by the above method)
float nextAccelValue = firstAccelValue;

while (nextAccelValue == firstAccelValue){

    //do something
    nextAccelValue = globalAccel; // note globalAccel is updated by the accelerometer method

}

上記のループは、アクセルメーター:didAccelerate:メソッドが呼び出されないため、予想されることではありません。したがって、GlobalAccelは値を変更しません。

固定条件を使用してwhileループを破ると、ループが終了した後、メソッドが再び正常に動作することがわかります。

ここで何か明白なものが足りないのですか?または、特定の処理が行われているときに加速度計メソッドは発火しませんか?

どんな助けも大歓迎です!ありがとう!

正しい解決策はありません

他のヒント

(比較しないでください float==.)

CPUはループで占められており、更新されたアクセラレータ値を提供する時間がありません。

以来 -accelerometer:didAccelerate: 加速度が変わるたびに呼ばれますが、なぜ使用しないのですか if?

// in -accelerometer:didAccelerate:
if (fabs(nextAccelValue - firstAccelValue) < 0.0001) {
   // do something
   nextAccelValue = globalAccel;
}

どうもありがとう! (フロートの比較について、はい、私は理解しています、それは単なる例でした)。

実際、私がやりたいのは次のとおりです。ボタンが押された後、加速度計の値(FirstValue)を取得してから、変更するまで(FirstValueに関連する特定の値を言う)、タスクを実行します。そのため、私はwhileループを使用していました。 (表示するループは、変更されるまで待機しますが、機能したら必要な正確な変更条件を配置できます)。

あなたの答えから、私は-ACCELEREMOMEMOMEMEMOMER:DIDACCELERET:FUNCTION自体でタスクを実行できることを理解しています(必要なすべてのデータにアクセスできるため、ボタンが押されたかどうかを示す変数にアクセスすることができます)。どうもありがとう。このように機能させることができると思います。

しかし、ただ好奇心が強い - そうでなければそれをする方法はありますか?処理が多すぎる場合、CPUが密集している場合、加速度計を何らかの形で更新するように強制できますか? CPU自体をホギー化するループは、値が変わるまで待つ方法だったので、優先度が低いです。

再度、感謝します!

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top