按顺序播放多媒体内容

时间:2010-08-15 07:54:54

标签: iphone cocoa-touch mpmovieplayercontroller nsoperation nsnotifications

嗨我有一个NSArray包含许多'多媒体动作',因为我喜欢称它们为对象,它封装了一些多媒体内容,如电影和照片。我想按顺序“玩”它们,等待每一个完成后再打电话给对方。

在调用下一个操作之前管理每个操作的持续时间的最佳方法是什么?(对于照片想象一个UIAlertView在几秒钟后延迟解雇,对于电影想象一个MPMoviePlayerController而不是)

我已经调用了使用NSOperation扫描数组的方法。

重要事项:无论是否在NSOperation中调用,MPMovieController似乎都不会播放(界面甚至不显示)。还有其他人遇到过这个问题吗?

更新使用performSelectorOnMainThread:使MPMoviePlayer按预期工作

1 个答案:

答案 0 :(得分:1)

这是我设法找到的解决方案。我发布的是任何人都感兴趣的案例。

首先,我将所有'多媒体动作'放在NSOperationQueue中并将maxConcurrentOperationCount设置为1,因此我确信它们将从主线程异步运行,但只有一个在以FIFO顺序排列的时间(这一点非常重要,您希望屏幕上的内容不重叠)。

然后对于每个动作,我会根据其类/种类以特定方式激活它。我们假设有三种行为:

  1. UIAlertViews子类
  2. 的MPMoviePlayerController状
  3. 后台操作(不涉及多媒体内容立即显示在当前视图中的操作
  4. 对于前两个,我使用NSNotifications来管理队列,因为我不知道内容何时会停止播放或将被用户解雇(假设通过触摸)。所以对于每一个我:

    • 使用setSuspended:YES
    • 暂停队列执行
    • 为相应的NSNotification添加观察者
    • 播放内容
    • 完成播放后发布通知
    • 删除观察者并使用setSuspended:NO
    • 再次启动队列

    对于UIAlertView,通知会以performSelector:withObject:afterDelay:张贴,说明应显示的时间或双击后的时间。对于A MPMovieController,它会自动启动并命名为MPMoviePlayerPlaybackDidFinishNotification。 UIAlertView和MP类都应在主线程上播放。

    第三种可以是简单地在放入队列的NSInvocationOperation中执行的一组指令。所以我甚至可以创建像'wait'这样暂停队列执行几秒钟的动作