Акселерометр 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: (поскольку у нее есть доступ ко всем необходимым данным, я могу получить доступ к переменной, указывающей, была ли нажата кнопка). Большое спасибо за это. Я думаю, я могу заставить это работать таким образом.

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

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

Другие вопросы по тегам