Мониторинг уровня заряда батареи iPhone4 iOS5 нужно ли добавлять setBatteryMonitoringEnabled:NO к периодическим проверкам батареи?

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

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

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


person Alex Stone    schedule 09.11.2011    source источник
comment
Почему бы не установить для него значение YES и позволить телефону оповещать ваше приложение, когда батарея достаточно разряжена? Не похоже, чтобы постоянно проводились опросы. О.С. несколько оптимизирован и должен нормально вызывать методы делегата.   -  person Michael Dautermann    schedule 09.11.2011


Ответы (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 : если вы используете уведомления и не опрашиваете состояние батареи вручную, тогда ответ заключается в том, что вы должны оставить его на уровне YES или рискуете пропустить уведомления.

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

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

person Tad Bumcrot    schedule 06.12.2011