iPhone accéléromètre: didAccelerate: semble pas se dit alors que je me présente une boucle

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

Question

Un accéléromètre question connexe. (Désolé le formatage peut ne pas regarder à droite, est la première fois que je utilise ce site). Je suis l'accéléromètre fonctionne comme prévu en utilisant le code standard

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

J'utilise NSLog pour se connecter à chaque fois que l'accéléromètre: didAccelerate: méthode dans ma classe est appelée. La fonction est appelée comme prévu et tout fonctionne bien jusqu'à ici.

Cependant, quand je lance une boucle, la méthode ci-dessus ne semble pas s'appeler. Quelque chose comme ceci

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

}

La boucle au-dessus jamais sorties, depuis l'accéléromètre expectedly: didAccelerate:. Méthode n'est pas appelé, et par conséquent ne change jamais globalAccel valeur

Si j'utiliser une condition fixe pour briser la boucle while, je peux voir que, après la fin de la boucle, les appels de méthodes fonctionnent bien à nouveau.

Suis-je manque quelque chose évidente ici? Ou la méthode accéléromètre ne se déclenche pas lorsque certains traitement est fait?

Toute aide serait grandement appréciée! Merci!

Pas de solution correcte

Autres conseils

(Ne pas comparer avec float ==.)

La CPU est occupée par la boucle et n'a pas le temps de vous donner la valeur de l'accélérateur mis à jour.

Depuis -accelerometer:didAccelerate: est appelé à chaque fois que les changements d'accélération, pourquoi ne pas utiliser if?

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

Merci beaucoup pour ça! (A propos de la comparaison du flotteur, oui, je comprends, il était juste un exemple).

En fait, ce que je veux faire est la suivante: Après un bouton est pressé, je veux obtenir la valeur de l'accéléromètre (firstValue) puis attendre jusqu'à ce qu'il change (pour dire une valeur particulière par rapport à firstValue), puis passez à faire certaines tâches. En tant que tel que j'utilisais la boucle while. (La boucle attend juste que je montre jusqu'à ce qu'il change, mais je peux mettre la condition de changement exact requis une fois cela fonctionne).

De votre réponse, je comprends que je peux effectuer la tâche dans le -accelerometer: didAccelerate: fonction elle-même (car il a accès à toutes les données dont il a besoin, je peux le faire accéder à une variable indiquant si le bouton a été pressé) . Merci beaucoup pour cela. Je suppose que je peux le faire fonctionner de cette façon.

Mais juste curieux - est-il un moyen de le faire autrement? Si trop de traitement est monopolisant le CPU, puis-je forcer à mettre à jour l'accéléromètre en quelque sorte? La boucle monopolisant le CPU lui-même est faible priorité car il était juste ma façon d'attendre jusqu'à ce que les changements de valeur.

Merci encore!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top