Нужно ли мне добавлять setBatteryMonitoringEnabled для мониторинга уровня заряда батареи iPhone4 на iOS5?

Я запускаю приложение, которое собирает данные акселерометра и гироскопа в одночасье. Это очень энергоемкая операция, и я хотел бы научить мое приложение распознавать, когда батарея разряжается.

Вот мой прототип кода, который проверяет уровень заряда батареи каждые 10 минут

NSDate* date = [NSDate date];
      if((int)([date timeIntervalSinceReferenceDate])%600 == 0)
            {
                UIDevice *myDevice = [UIDevice currentDevice];
                [myDevice setBatteryMonitoringEnabled:YES];
                float batLeft = [myDevice batteryLevel]; 
                int batinfo=(batLeft*100);

            [self postStatusMessageWithTitle:nil
                                 description:[NSString stringWithFormat:@"%@ battery level: %i",[dateFormat stringFromDate:dateShow],batinfo]];
                [myDevice setBatteryMonitoringEnabled:NO];
            }

Мой вопрос заключается в следующем: мне нужно добавить эту строку в конец кода:

[myDevice setBatteryMonitoringEnabled:NO];

Похоже, что проверка батареи выполняется тут же, асинхронных вызовов делегатов нет. Приведет ли установка значения «NO» к экономии заряда батареи из-за того, что нет необходимости контролировать уровень заряда батареи в течение ночи? Буду ли я что-нибудь сломать, установив НЕТ?

Спасибо за любой вклад!

 Michael Dautermann09 нояб. 2011 г., 06:54
Почему бы не установить его на ДА и позволить телефону оповещать ваше приложение, когда батарея разряжена? Это не значит, что происходит постоянный опрос. О.С. несколько оптимизирован и должен нормально вызывать методы делегата.

Ответы на вопрос(1)

Решение Вопроса

ления из системы, например так:

[[UIDevice currentDevice] setBatteryMonitoringEnabled:YES];
[[NSNotificationCenter defaultCenter]
        addObserver:self
           selector:@selector(batteryLevelUpdate)
               name:UIDeviceBatteryLevelDidChangeNotification
             object:nil];

…гдеbatteryLevelUpdate будет выглядеть так:

- (void)batteryLevelUpdate:(NSNotification *)notification
{
    // do whatever, using: [[UIDevice currentDevice] batteryLevel]
}

ИзСсылка на класс UIDevice:

Уведомления об изменении уровня заряда батареи отправляются не чаще одного раза в минуту. Не пытайтесь рассчитать скорость разряда батареи или оставшееся время работы батареи; Скорость осушения может часто меняться в зависимости от встроенных приложений, а также вашего приложения.

Раз в минуту это в 10 раз чаще, чем проверяет ваш код, затрачивая при этом гораздо меньше усилий на процессор. Оно делаетне Отметьте, однако, какая гранулярность изменений будет вызывать уведомления - будет ли отправлено изменение на 0,01%, или оно требует изменения> 1%?

Чтобы ответить на ваш другой вопрос, если вы должны установитьsetBatteryMonitoringEnabled вернуться кNO : если вы используете уведомления и не запрашиваете данные вручную для batteryStatus, то ответ заключается в том, что вы должны оставить его вYESили рискуете пропустить уведомления.

Официальный пример кода BatteryStatus от Apple использует то же самое представление о состоянии батареи.

Также естьUIDeviceBatteryStateDidChangeNotification который уведомит вас, когда устройство разряжается (используется), заряжается или полностью заряжается.

Ваш ответ на вопрос