6

我有一个使用 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 更新。

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

4

1 回答 1

7

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

定时器不是实时机制;它仅在已添加计时器的运行循环模式之一正在运行并且能够检查计时器的触发时间是否已过时触发。

NSTimer 类参考

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

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

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

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

iOS 应用程序编程指南

于 2012-06-04T08:28:49.690 回答