2

こんにちは私は、映画や写真などのマルチメディアコンテンツをカプセル化するオブジェクトである「マルチメディアアクション」を多く含むNSArrayを持っています。それぞれが終了するのを待ってから、もう一方を呼び出す前に、順番に「再生」したいと思います。

次の操作を呼び出す前に、各操作の期間を管理するための最良の方法は何ですか?(写真の場合は数秒の遅延後に閉じるUIAlertViewを想像し、映画の場合は代わりにMPMoviePlayerControllerを想像してください)

NSOperationを使用して配列をスキャンするメソッドをすでに呼び出しています。

重要: NSOperation内で呼び出されたかどうかに関係なく、MPMovieControllerは再生されない(インターフェイスも表示されない)ようです。他の誰かがこの問題を経験しましたか?

UPDATEを使用performSelectorOnMainThread:すると、MPMoviePlayerが期待どおりに機能します

4

1 に答える 1

1

これは私が見つけた解決策です。興味のある方のために投稿します。

まず、すべての「マルチメディアアクション」をaに入れNSOperationQueue、を1に設定しmaxConcurrentOperationCountます。これにより、メインスレッドから非同期で実行されますが、FIFOの順序で一度に1つだけ実行されると確信しています(これは非常に重要です。コンテンツが画面上で重ならないこと)。

次に、アクションごとに、クラス/種類に応じて特定の方法でアクティブ化します。3種類のアクションがあるとしましょう。

  1. UIAlertViewsサブクラス
  2. MPMoviePlayerControllerのような
  3. バックグラウンドアクション(マルチメディアコンテンツを含まないアクションが現在のビューに即座に表示される

最初の2つはNSNotifications、コンテンツの再生がいつ停止するか、ユーザーによって却下されるかがわからないため、キューの管理に使用します(タッチによる場合を想定)。だから私はそれらのそれぞれについて:

  • キューの実行を一時停止しますsetSuspended:YES
  • 対応するNSNotificationのオブザーバーを追加します
  • コンテンツを再生する
  • 再生が終了したら通知を投稿する
  • オブザーバーを削除し、でキューを再開しますsetSuspended:NO

UIAlertViewの場合、通知は、performSelector:withObject:afterDelay:表示される時間の長さ、またはダブルタップ後に通知が投稿されます。代わりに、MPMovieControllerの場合、自動的に起動され、という名前が付けられMPMoviePlayerPlaybackDidFinishNotificationます。UIAlertViewとMPの種類の両方がメインスレッドで再生されます。

3番目の種類は、キューに入れられたNSInvocationOperationで単純に実行される一連の命令です。したがって、キューの実行を数秒間中断する「待機」のようなアクションを作成することもできます

于 2010-08-20T08:45:38.050 に答える