Акселерометр iPhone:didAccelerate: кажется, не вызывается, пока я бегу
Вопрос, связанный с акселерометром. (Извините, форматирование может выглядеть неправильно, это первый раз, когда я использую этот сайт). Я получил акселерометр работает, как и ожидалось, используя стандартный код
UIAccelerometer *accel = [UIAccelerometer sharedAccelerometer];
accel.delegate = self;
accel.updateInterval = 0.1; //I also tried other update values
Я использую NSLog, чтобы регистрировать каждый раз, когда акселерометр:didAccelerate: метод в моем классе вызывается. Функция вызывается, как и ожидалось, и все работает до сих пор.
Однако, когда я запускаю цикл, вышеупомянутый метод, кажется, не вызывается. Что-то вроде этого
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
}
Вышеупомянутый цикл никогда не завершается, как ожидается, поскольку акселерометр:didAccelerate: метод не вызывается, и, следовательно, globalAccel никогда не изменяет значение.
Если я использую фиксированное условие для прерывания цикла while, я вижу, что после завершения цикла вызовы метода снова работают нормально.
Я что-то упускаю здесь очевидное? Или метод акселерометра не срабатывает, когда выполняется определенная обработка?
Любая помощь будет принята с благодарностью! Спасибо!
2 ответа
(Не сравнивайте float
с ==
.)
Процессор занят циклом и не успевает дать вам обновленное значение ускорителя.
поскольку -accelerometer:didAccelerate:
вызывается каждый раз, когда меняется ускорение, почему бы просто не использовать if
?
// in -accelerometer:didAccelerate:
if (fabs(nextAccelValue - firstAccelValue) < 0.0001) {
// do something
nextAccelValue = globalAccel;
}
Большое спасибо за это! (Про сравнение поплавков, да я понимаю, это был просто пример).
На самом деле, я хочу сделать следующее: после нажатия кнопки я хочу получить значение акселерометра (firstValue), а затем подождать, пока оно изменится (скажем, определенное значение относительно firstValue), а затем приступить к выполнению некоторых задач. Поэтому я использовал цикл while. (Цикл, который я показываю, просто ждет, пока он изменится, но я могу поставить точное условие изменения, необходимое, как только оно заработает).
Из вашего ответа я понимаю, что могу выполнить задачу в самой функции -accelerometer:didAccelerate: (поскольку у нее есть доступ ко всем необходимым данным, я могу получить доступ к переменной, указывающей, была ли нажата кнопка). Большое спасибо за это. Я думаю, я могу заставить это работать таким образом.
Но просто любопытно - есть ли способ сделать это иначе? Если процессор перегружен, могу ли я каким-то образом заставить его обновить акселерометр? Цикл, загружающий сам процессор, имеет низкий приоритет, так как это был просто мой способ ожидания, пока значение не изменится.
Еще раз спасибо!