Акселериметр 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 для регистрации каждый раз, когда акселерометр: DIDACCELERET: метод в моем классе вызывается. Функция называется, как ожидалось, и все работает нормально до здесь.

Однако, когда я запускаю петлю, вышеуказанный метод, похоже, не вызывается. Что-то вроде этого

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

}

Вышеуказанная петля никогда не выходит, ожидаемая с момента акселерометра: DIDACCELERE: метод не вызывается, и, следовательно, Globalaccel никогда не изменяет значение.

Если я использую фиксированное условие, чтобы сломать цикл While, я вижу, что после окончания цикла метод снова вызовы работают нормально.

Я упускаю что-то очевидное здесь? Или метод акселерометра не огонь, когда проводится определенная обработка?

Любая помощь была бы очень ценится! Спасибо!

Нет правильного решения

Другие советы

(Не сравнивайте float с участием ==.)

ЦП занимается петлей и не имеет времени, чтобы дать вам обновленное значение ускорителя.

С -accelerometer:didAccelerate: называется каждый раз, когда ускорение меняется, почему бы не просто использовать if?

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

Большое спасибо за это! (О сравнении по плаванию, да я понимаю, это был просто пример).

На самом деле, что я хочу сделать, это так: после нажатия кнопки я хочу получить значение акселерометра (FirstValue), а затем подождите, пока он не изменится (чтобы сказать конкретное значение относительно первой передачи), а затем приступить к некоторым задачам. Как таковой я использовал цикл While. (Цикл, который я показываю, просто ждет, пока он не изменится, но я могу поставить точное изменение условия требуемого после его работы).

От вашего ответа я понимаю, что я могу выполнить задачу в -ацелерометре: Didaccelerate: сама функция (поскольку она имеет доступ ко всем потребностям данных, я могу сделать его доступ к переменной, указывающей, была ли кнопка нажата). Большое спасибо за это. Я думаю, я могу сделать это работать таким образом.

Но просто любопытно - есть ли способ сделать это в противном случае? Если слишком много обработки, вступает в процессор, могу ли я еще каким-то образом обновлять акселерометр? Корпус, высушая сам процессор, является низким приоритетом, так как это был просто мой способ ожидания до изменения значения.

Спасибо еще раз!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top