акселерометр iPhone: didAccelerate: кажется, не вызывается, пока я бегу - PullRequest
1 голос
/ 22 апреля 2010

Вопрос, связанный с акселерометром.(Извините, форматирование может выглядеть неправильно, это первый раз, когда я использую этот сайт).Я получил акселерометр, как и ожидалось, используя стандартный код

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 ]

2 голосов
/ 22 апреля 2010

(не сравнивайте float с ==.)

ЦП занят циклом и не может дать вам обновленное значение ускорителя.

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

// in -accelerometer:didAccelerate:
if (fabs(nextAccelValue - firstAccelValue) < 0.0001) {
   // do something
   nextAccelValue = globalAccel;
}
0 голосов
/ 22 апреля 2010

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

Собственно, я хочу сделать следующее: после нажатия кнопки я хочу получить значение акселерометра (firstValue), а затем подождать, пока оно изменится (скажем, определенное значение относительно firstValue), а затем перейти к некоторые задачи. Поэтому я использовал цикл while. (Цикл, который я показываю, просто ждет, пока он изменится, но я могу поставить точное условие изменения, необходимое, как только оно заработает).

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

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

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

...