iPhone Accelerometer: Didaccelerate: scheint nicht angerufen zu werden, während ich eine Schleife ausführe

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

Frage

Eine Beschleunigungsmesser -Frage. (Entschuldigung, die Formatierung sieht möglicherweise nicht richtig aus, es ist das erste Mal, dass ich diese Site verwende). Ich habe das Beschleunigungsmesser wie erwartet mit dem Standardcode funktioniert

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

Ich verwende NSLog, um jedes Mal, wenn der Beschleunigungsmesser: Didaccelerate: Methode in meiner Klasse aufgerufen wird. Die Funktion wird wie erwartet aufgerufen und alles funktioniert bis hier gut.

Wenn ich jedoch eine Schleife ausführe, scheint die obige Methode nicht aufgerufen zu werden. Etwas wie das

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

}

Die obige Schleife verlässt nie erwartet, da das Beschleunigungsmesser: Didaccelerate: Methode nicht aufgerufen wird, und daher ändert GlobalAccel den Wert nie.

Wenn ich eine feste Bedingung verwende, um die While -Schleife zu brechen, kann ich sehen, dass nach dem Ende der Schleife die Methode wieder gut funktioniert.

Vermisse ich hier etwas Offensichtliches? Oder feuert die Beschleunigungsmessermethode nicht aus, wenn eine bestimmte Verarbeitung durchgeführt wird?

Jede Hilfe wäre sehr geschätzt! Vielen Dank!

Keine korrekte Lösung

Andere Tipps

(Vergleiche nicht float mit ==.)

Die CPU ist von der Schleife besetzt und hat keine Zeit, Ihnen den aktualisierten Beschleunigerwert zu geben.

Seit -accelerometer:didAccelerate: wird jedes Mal aufgerufen, wenn sich die Beschleunigung ändert, warum nicht einfach nur verwenden if?

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

Vielen Dank dafür! (Über den Float -Vergleich, ja, ich verstehe, es war nur ein Beispiel).

Tatsächlich möchte ich Folgendes: Nachdem eine Taste gedrückt wurde, möchte ich den Beschleunigungsmesserwert (FirstValue) erhalten und dann warten, bis er ändert (um einen bestimmten Wert in Bezug auf FirstValue zu sagen) und dann einige Aufgaben auszuführen. Als solches benutzte ich die While -Schleife. (Die Schleife, die ich zeige, wartet nur, bis sie sich ändert, aber ich kann die genaue Änderungsbedingung einsetzen, sobald er funktioniert).

Aus Ihrer Antwort verstehe ich, dass ich die Aufgabe im Wachbewerbsmesser ausführen kann: Didaccelerate: Funktion selbst (da sie auf alle Daten zugreifen kann, kann ich auf eine Variable zugreifen, die angibt, ob die Taste gedrückt wurde). Vielen Dank dafür. Ich denke, ich kann es auf diese Weise zum Laufen bringen.

Aber nur neugierig - gibt es eine Möglichkeit, es anders zu tun? Wenn zu viel Verarbeitung die CPU abschließt, kann ich sie dann dazu zwingen, das Beschleunigungsmesser irgendwie zu aktualisieren? Die Schleife, die die CPU selbst in Schwierigkeiten hat, hat eine niedrige Priorität, da es nur meine Art war, bis sich der Wert ändert.

Danke noch einmal!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top