Это решение, которое мне удалось найти. Я публикую это на тот случай, если кому-то будет интересно.
Сначала я поместил все свои «мультимедийные действия» в NSOperationQueue
и установил maxConcurrentOperationCount
на 1, поэтому я уверен, что они будут выполняться асинхронно из основного потока, но только по одному в FIFO порядок (это очень важно, если вы хотите, чтобы ваш контент не перекрывался на экране).
Затем для каждого действия я активирую его определенным образом, в зависимости от его класса / вида. Предположим, есть три вида действий:
- UIAlertViews подклассы
- MPMoviePlayerController типа
- Фоновые действия (действия, которые не связаны с мультимедийным контентом, для мгновенного отображения в текущем представлении
Для первых двух я использую NSNotifications
для управления очередью, поскольку я не знаю, когда контент прекратит воспроизведение или будет отклонен пользователем (предположительно, на ощупь). Итак, для каждого из них я:
- Приостановить выполнение очереди с помощью
setSuspended:YES
- Добавить наблюдателя для соответствующей NSNotification
- Воспроизведение контента
- Опубликовать уведомление, когда они закончат играть
- Удалить наблюдателя и снова запустить очередь с помощью
setSuspended:NO
Для UIAlertView уведомление публикуется с performSelector:withObject:afterDelay:
с указанием времени, в течение которого оно должно отображаться, или после двойного нажатия. Для MPMovieController вместо этого он запускается автоматически и называется MPMoviePlayerPlaybackDidFinishNotification
. И UIAlertView, и тип MP должны воспроизводиться в основном потоке.
Третий тип может быть набором команд, просто выполняемых в NSInvocationOperation, помещенном в очередь. Так что я даже могу создать такие действия, как «ожидание», которые приостанавливают выполнение очереди на несколько секунд