これは私が見つけた解決策です。興味のある方のために投稿します。
まず、すべての「マルチメディアアクション」をaに入れNSOperationQueue
、を1に設定しmaxConcurrentOperationCount
ます。これにより、メインスレッドから非同期で実行されますが、FIFOの順序で一度に1つだけ実行されると確信しています(これは非常に重要です。コンテンツが画面上で重ならないこと)。
次に、アクションごとに、クラス/種類に応じて特定の方法でアクティブ化します。3種類のアクションがあるとしましょう。
- UIAlertViewsサブクラス
- MPMoviePlayerControllerのような
- バックグラウンドアクション(マルチメディアコンテンツを含まないアクションが現在のビューに即座に表示される
最初の2つはNSNotifications
、コンテンツの再生がいつ停止するか、ユーザーによって却下されるかがわからないため、キューの管理に使用します(タッチによる場合を想定)。だから私はそれらのそれぞれについて:
- キューの実行を一時停止します
setSuspended:YES
- 対応するNSNotificationのオブザーバーを追加します
- コンテンツを再生する
- 再生が終了したら通知を投稿する
- オブザーバーを削除し、でキューを再開します
setSuspended:NO
UIAlertViewの場合、通知は、performSelector:withObject:afterDelay:
表示される時間の長さ、またはダブルタップ後に通知が投稿されます。代わりに、MPMovieControllerの場合、自動的に起動され、という名前が付けられMPMoviePlayerPlaybackDidFinishNotification
ます。UIAlertViewとMPの種類の両方がメインスレッドで再生されます。
3番目の種類は、キューに入れられたNSInvocationOperationで単純に実行される一連の命令です。したがって、キューの実行を数秒間中断する「待機」のようなアクションを作成することもできます