iPhone accelerometro: didAccelerate: sembra di non ottenere chiamato mentre io sono in esecuzione di un ciclo

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

Domanda

Un accelerometro domanda relativa. (Scusate la formattazione potrebbe non guardare a destra, è la prima volta che sto usando questo sito). Ho avuto l'accelerometro di lavoro come previsto utilizzando il codice standard

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

Io uso NSLog per registrare ogni volta l'accelerometro: didAccelerate: metodo nella mia classe si chiama. La funzione viene chiamata come previsto e tutto funziona bene fino a qui.

Tuttavia, quando si esegue un ciclo, il metodo di cui sopra non sembra ottenere chiamato. Qualcosa di simile a questo

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

}

Il ciclo precedente mai uscite, expectedly poiché l'accelerometro: didAccelerate:. Metodo non sempre chiamato, e quindi non cambia mai globalAccel valore

Se io uso una condizione fissata per rompere il ciclo while, posso vedere che dopo la fine del ciclo, le chiamate di metodo funzionano bene ancora una volta.

Mi sto perdendo qualcosa di ovvio qui? Oppure il metodo accelerometro si attiva quando certa trasformazione è stato fatto?

Qualsiasi aiuto sarebbe molto apprezzato! Grazie!

Nessuna soluzione corretta

Altri suggerimenti

(non si confronta con float ==.)

La CPU è occupata dal circuito e non ha tempo per darvi il valore acceleratore aggiornato.

Dal -accelerometer:didAccelerate: è chiamato ogni volta che i cambiamenti di accelerazione, perché non basta usare if?

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

Grazie mille per questo! (A proposito del confronto galleggiante, sì ho capito, era solo un esempio).

In realtà, quello che voglio fare è questo: Dopo aver premuto un pulsante, voglio ottenere il valore accelerometro (FirstValue) e poi aspettare fino a quando cambia (per non dire un particolare valore relativo al FirstValue) e quindi procedere a fare alcuni compiti. Come tale mi stava usando il ciclo while. (Il ciclo mostro aspetta solo fino a quando non cambia, ma posso mettere l'esatta condizione di cambiamento richiesto una volta funziona).

Dalla tua risposta, ho capito che posso svolgere il compito nella -accelerometer: didAccelerate: funzione stessa (dal momento che ha accesso a tutti i dati di cui ha bisogno, posso farlo accedere a una variabile che indica se il pulsante è stato premuto) . Grazie molto per questo. Credo di poter farlo funzionare in questo modo.

Ma solo curioso - c'è un modo per farlo altrimenti? Se troppo l'elaborazione sta intasando il CPU, posso forzarlo aggiornare accelerometro in qualche modo? Il ciclo monopolizzavano la CPU stessa è bassa priorità dal momento che era solo il mio modo di aspettare fino a quando il valore cambia.

Grazie ancora!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top