Acelerómetro de iPhone: didaccelerate: parece no ser llamado mientras estoy ejecutando un bucle

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

Pregunta

Una pregunta relacionada con el acelerómetro. (Lo siento, el formato puede no verse bien, es la primera vez que uso este sitio). Hice que el acelerómetro funcionara como se esperaba usando el código estándar

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

Utilizo NSLOG para registrar cada vez que se llama al Acelerómetro: DidAccelate: Método en mi clase. La función se llama como se esperaba y todo funciona bien hasta aquí.

Sin embargo, cuando ejecuto un bucle, el método anterior no parece llamarse. Algo como esto

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

}

El bucle anterior nunca sale, esperadamente, ya que el acelerómetro: didaccelerate: el método no se llama y, por lo tanto, GlobalAccel nunca cambia el valor.

Si uso una condición fija para romper el bucle While, puedo ver que después de que termina el bucle, el método llama bien nuevamente.

¿Me estoy perdiendo algo obvio aquí? ¿O el método del acelerómetro no se dispara cuando se está realizando cierto procesamiento?

¡Cualquier ayuda sería muy apreciada! ¡Gracias!

No hay solución correcta

Otros consejos

(No te compares float con ==.)

La CPU está ocupada por el bucle y no tiene tiempo para darle el valor actualizado del acelerador.

Ya que -accelerometer:didAccelerate: se llama cada vez que cambia la aceleración, ¿por qué no solo usar if?

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

¡Muchas gracias por eso! (Sobre la comparación flotante, sí, entiendo, fue solo un ejemplo).

En realidad, lo que quiero hacer es esto: después de presionar un botón, quiero obtener el valor del acelerómetro (FirstValue) y luego esperar hasta que cambie (para decir un valor particular en relación con FirstValue) y luego proceder a hacer algunas tareas. Como tal, estaba usando el bucle While. (El bucle que muestro solo espera hasta que cambia, pero puedo poner la condición de cambio exacta requerida una vez que funcione).

Desde su respuesta, entiendo que puedo realizar la tarea en la función -accelerómetro: didaccelerate: en sí misma (ya que tiene acceso a todos los datos que necesita, puedo hacer que acceda a una variable que indica si se presionó el botón). Muchas gracias por eso. Supongo que puedo hacer que funcione de esta manera.

Pero solo curiosidad, ¿hay alguna manera de hacerlo de otra manera? Si demasiado procesamiento está acaparando la CPU, ¿puedo obligarla a actualizar el acelerómetro de alguna manera? El bucle que acaba la CPU en sí es de baja prioridad, ya que era solo mi forma de esperar hasta que cambie el valor.

¡Gracias de nuevo!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top