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            
    }

}

アプリがバックグラウンドにある場合でも、タイマーは1秒ごとに実行されます。このメソッドは、最初にアプリがアクティブでプレーヤーが再生されているかどうかを確認してから、UIの更新を行います。

この方法で毎秒タイマーを実行することによるバッテリー寿命への影響はありますか?バックグラウンドに入るときにタイマーを破棄し、アプリをアクティブ化するときにタイマーを再度アクティブ化するように、もっと注意を払う必要がありますか?バッテリー寿命の影響はあると思いますが、現実的にはどれくらい深刻ですか?または、この種のことを行うための他の推奨される方法はありますか?

4

1 に答える 1

7

NSTimer の使用がバッテリーの寿命に大きな影響を与えるとは想像できません。トリガーされたときに行われる作業がバッテリーの寿命に影響を与えない限りです。タイマーは単に現在の実行ループに追加されています。

タイマーはリアルタイムのメカニズムではありません。タイマーが追加された実行ループ モードの 1 つが実行中で、タイマーの起動時間が経過したかどうかを確認できる場合にのみ起動します。

NSTimer クラス リファレンス

ドキュメントによると、アプリケーションがアクティブ ステータスを辞退しようとしているときは、タイマーを一時停止する必要があります。

この変更に応じて、アプリは applicationWillResignActive: メソッドで次のことを行う必要があります。

  • タイマーやその他の定期的なタスクを停止します
  • 実行中のメタデータ クエリを停止します。
  • 新しいタスクを開始しないでください。
  • 動画の再生を一時停止します (AirPlay で再生する場合を除く)。
  • アプリがゲームの場合は、一時停止状態に入ります。
  • OpenGL ES フレーム レートを抑制します。
  • 重要でないコードを実行しているディスパッチ キューまたはオペレーション キューを一時停止します。(非アクティブな間、ネットワーク要求やその他の時間的制約のあるバックグラウンド タスクの処理を続行できます。)

アプリがアクティブな状態に戻ると、その applicationDidBecomeActive: メソッドは、applicationWillResignActive: メソッドで実行されたすべての手順を逆にする必要があります。したがって、再アクティブ化すると、アプリはタイマーを再起動し、ディスパッチ キューを再開し、OpenGL ES フレーム レートを再度調整する必要があります。ただし、ゲームは自動的に再開されるべきではありません。ユーザーが再開することを選択するまで、一時停止したままにする必要があります。

iOS アプリ プログラミング ガイド

于 2012-06-04T08:28:49.690 に答える