【问题标题】:How to monitor MPMoviePlayerController playback progress while not killing a battery?如何在不耗尽电池的情况下监控 MPMoviePlayerController 播放进度?
【发布时间】:2012-06-04 06:45:52
【问题描述】:

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

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

【问题讨论】:

  • 只需按照@ChrisGummer 的建议使用计时器。 MPMoviePlayerController 框架或类似回调没有 KVO。然而,对于 AVFoundation (AVPlayer) 有这样的事情 - 尽管如此,由于给定的原因,没有必要避免使用计时器。

标签: ios cocoa-touch mpmovieplayercontroller nstimer


【解决方案1】:

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

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

NSTimer Class Reference

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

为响应这一变化,您的应用应在其 applicationWillResignActive: 方法:

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

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

iOS App Programming Guide

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-20
    • 2011-02-28
    • 1970-01-01
    • 2015-01-18
    • 1970-01-01
    • 2014-05-02
    • 1970-01-01
    • 2011-09-09
    相关资源
    最近更新 更多