我有一个使用MPMoviePlayerController播放音乐的媒体播放器应用。我需要根据播放位置更新UI。我能说的最好,没有办法通过回调等方式从玩家那里积极接收这些信息,我基本上需要自己进行轮询。
所以我想我会使用一个简单的计时器,每秒运行一次。代码是这样的:
设置代码中的某处:
[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(updatePlaybackProgressFromTimer:) userInfo:nil repeats:YES];
然后:
- (void) updatePlaybackProgressFromTimer:(NSTimer *)timer {
if (([UIApplication sharedApplication].applicationState == UIApplicationStateActive) && (player.playbackState == MPMoviePlaybackStatePlaying)) {
CGFloat progress = player.currentPlaybackTime / player.duration;
// do something useful with this info
}
}
即使应用程序在后台,计时器也会每秒运行一次。该方法首先查看应用是否处于活动状态且播放器正在播放,然后进行一些UI更新。
以这种方式每秒运行计时器是否有电池寿命的影响?我是否应该更勤奋并尝试在进入后台时拆除计时器并在激活应用程序时重新激活它?我确定有一些电池寿命效应,但实际上,它有多严重?还是有其他推荐的方法来做这种事情吗?
答案 0 :(得分:7)
我无法想象使用NSTimer会显着影响电池寿命 - 除非触发工作时影响电池寿命。只是将计时器添加到当前运行循环中:
计时器不是实时机制;它只在其中一个发射时发射 已添加计时器的运行循环模式正在运行且能够运行 检查计时器的开火时间是否已经过去。
根据文档,当您的应用程序即将辞职时,您应该暂停任何计时器:
为了响应此更改,您的应用应在其中执行以下操作 applicationWillResignActive:方法:
- 停止计时器和其他定期任务。
- 停止正在运行的元数据查询。
- 不要发起任何新任务。
- 暂停播放动画(通过AirPlay播放时除外)。
- 如果您的应用是游戏,请进入暂停状态。
- 重新调整OpenGL ES帧速率。
- 暂停执行非关键代码的任何调度队列或操作队列。 (您可以继续处理网络请求和 其他时间敏感的后台任务,同时处于非活动状态。)
当您的应用程序移回活动状态时,它会 applicationDidBecomeActive:方法应该反转任何步骤 采用applicationWillResignActive:方法。 因此,在 重新激活,您的应用应该重新启动计时器,继续发送 排队,并再次降低OpenGL ES帧速率。但是,游戏 不应该自动恢复;他们应该保持暂停直到 用户选择恢复它们。