Акселериметр iPhone: Didaccelerate: кажется, не вызывается, пока я управляю петлей
-
30-09-2019 - |
Вопрос
Акселерометр, связанный с вопросом. (Извините, что форматирование не может выглядеть правильно, это первый раз, когда я использую этот сайт). Я получил акселерометр, работающий, как ожидалось, используя стандартный код
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: сама функция (поскольку она имеет доступ ко всем потребностям данных, я могу сделать его доступ к переменной, указывающей, была ли кнопка нажата). Большое спасибо за это. Я думаю, я могу сделать это работать таким образом.
Но просто любопытно - есть ли способ сделать это в противном случае? Если слишком много обработки, вступает в процессор, могу ли я еще каким-то образом обновлять акселерометр? Корпус, высушая сам процессор, является низким приоритетом, так как это был просто мой способ ожидания до изменения значения.
Спасибо еще раз!