我正在运行一个应用程序,可以在一夜之间对加速度计和陀螺仪数据进行采样。这是一个非常耗电的操作,我想教我的应用程序识别电池电量不足的时间。
这是我的原型代码,每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来解决任何问题吗?
感谢您的任何意见!
答案 0 :(得分:11)
通常认为最佳做法是避免轮询,而是要求系统发出通知,如下所示:
[[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]
}
电池电平变化通知的发送频率不会超过每分钟一次。不要试图计算电池排水率或电池剩余时间;排水率可能会频繁变化,具体取决于内置应用程序以及您的应用程序。
每分钟一次比你的代码当前检查的频率高10倍,同时在CPU方面花费更少的工作量。它不提及,但是更改的粒度会导致通知 - 发送的变化是0.01%,还是需要> 1%更改?
如果您要将setBatteryMonitoringEnabled
设置回NO
,请回答您的其他问题:如果您正在使用通知而不是手动轮询batteryStatus,那么答案是您必须将其保留在{{ 1}},或者有可能错过通知。
Apple's official BatteryStatus Sample Code对电池状态报告使用相同的内容。
还有一个YES
会在设备放电(正在使用中),充电或充满电时通知您。