Нужно ли мне добавлять setBatteryMonitoringEnabled для мониторинга уровня заряда батареи iPhone4 на iOS5? - PullRequest
3 голосов
/ 09 ноября 2011

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

Вот мой прототип кода, который проверяет уровень заряда батареи каждые 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» к экономии заряда батареи из-за того, что нет необходимости контролировать уровень заряда батареи в течение ночи? Я что-нибудь сломаю, установив НЕТ?

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

1 Ответ

11 голосов
/ 06 декабря 2011

Обычно рекомендуется избегать опроса и вместо этого запрашивать уведомления от системы, например:

[[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 Class Reference :

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

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

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

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

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

...