如何在不杀死电池的情况下监控MPMoviePlayerController播放进度?

Jaa*_*nus 6 cocoa-touch mpmovieplayercontroller nstimer ios

我有一个使用MPMoviePlayerController播放音乐的媒体播放器应用.我需要根据播放位置更新UI.我能说的最好,没有办法通过回调或其他东西主动接收来自玩家的信息,我基本上需要自己进行轮询.

所以我想我会使用一个简单的计时器,每秒运行一次.代码是这样的:

在设置代码中的某处:

[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(updatePlaybackProgressFromTimer:) userInfo:nil repeats:YES];
Run Code Online (Sandbox Code Playgroud)

然后:

- (void) updatePlaybackProgressFromTimer:(NSTimer *)timer {

    if (([UIApplication sharedApplication].applicationState == UIApplicationStateActive) && (player.playbackState == MPMoviePlaybackStatePlaying)) {

        CGFloat progress = player.currentPlaybackTime / player.duration;
        // do something useful with this info            
    }
Run Code Online (Sandbox Code Playgroud)

}

即使应用程序在后台,计时器也会每秒运行一次.该方法首先查看应用是否处于活动状态且播放器正在播放,然后进行一些UI更新.

以这种方式每秒运行计时器是否有电池寿命的影响?我是否应该更勤奋并尝试在进入后台时拆除计时器并在激活应用程序时重新激活它?我确定有一些电池寿命效应,但实际上,它有多严重?或者还有其他推荐的方法来做这种事吗?

小智 7

我无法想象使用NSTimer会显着影响电池寿命 - 除非触发工作时影响电池寿命.只是将计时器添加到当前运行循环中:

计时器不是实时机制; 只有当添加了计时器的其中一个运行循环模式正在运行并且能够检查计时器的触发时间是否已经过去时,它才会触发.

NSTimer类参考

根据文档,当您的应用程序即将重新启动其活动状态时,您应该暂停任何计时器:

为响应此更改,您的应用应在其applicationWillResignActive:方法中执行以下操作:

  • 停止计时器和其他周期性任务.
  • 停止任何运行的元数据查询
  • 不要发起任何新任务.
  • 暂停电影播放(通过AirPlay播放时除外).
  • 如果您的应用是游戏,请进入暂停状态.
  • 节流OpenGL ES帧速率.
  • 挂起执行非关键代码的任何调度队列或操作队列.(您可以在不活动时继续处理网络请求和其他时间敏感的后台任务.)

当您的应用程序移回活动状态时,其applicationDidBecomeActive:方法应该反转applicationWillResignActive:方法中执行的任何步骤.因此,重新激活后,您的应用程序应重新启动计时器,恢复调度队列,并再次降低OpenGL ES帧速率.但是,游戏不应该自动恢复; 它们应该保持暂停,直到用户选择恢复它们.

iOS应用程序编程指南