2

嗨我有一個NSArray包含許多'多媒體動作',因爲我喜歡稱它們爲封裝一些多媒體內容(如電影和照片)的對象。我想按順序「玩」它們,等待每個完成之後再打另一個。按順序播放多媒體內容

在調用下一個操作之前管理每個操作的持續時間的最佳方法是什麼?(對於一張照片想象一個UIAlertView,在幾秒鐘延遲後關閉,對於電影想象一個MPMoviePlayerController)

我已經調用了用NSOperation掃描數組的方法。

重要提示:似乎MPMovieController不會播放(界面甚至不會出現),無論是否在NSOperation中調用。有其他人遇到過這個問題嗎?

UPDATE使用performSelectorOnMainThread:使得MPMoviePlayer按預期方式工作

回答

1

這是我已經成功地找到解決方案。我在任何人感興趣的情況下發布它。

首先,我把我所有的'多媒體動作'放在一個NSOperationQueue中,我將maxConcurrentOperationCount設置爲1,所以我確定它們將與主線程異步運行,但一次只能有一個以FIFO的順序運行是非常重要的,你希望你的內容不會在屏幕上重疊)。

然後,對於每個動作,我都會根據其類/種類以特定方式激活它。讓我們假設有三種動作:

  1. UIAlertViews子
  2. 的MPMoviePlayerController樣
  3. 後臺操作(不涉及多媒體內容立即出現在當前視圖

採取行動前兩個我用NSNotifications來管理隊列,因爲我不知道什麼時候內容會停止播放,或者會被用戶解僱(假設通過觸摸)。因此,對於每一個我:

  • 暫停與setSuspended:YES
  • 隊列執行添加觀察員corrisponding NSNotification
  • 播放內容
  • 後,當他們完成播放
  • 刪除觀察者和啓動隊列再次setSuspended:NO
  • 通知

對於UIAlertView,通知發佈時間爲performSelector:withObject:afterDelay:,表示它的時間量大廳顯示或雙擊後。對於MPMovieController而言,它會自動啓動並命名爲MPMoviePlayerPlaybackDidFinishNotification。 UIAlertView和MP類型都將在主線程中播放。

第三類可以是一組簡單的執行在NSInvocationOperation中放入隊列的指令。所以我甚至可以創建類似'等待'的操作,暫停隊列執行幾秒鐘。