2

Bonjour, J'ai un NSArray contenant de nombreuses «actions multimédia» comme j'aime les appeler, des objets qui encapsulent du contenu multimédia comme des films et des photos. Je voudrais les «jouer» en séquence en attendant que chacun ait fini avant d'appeler l'autre.Lecture de contenu multimédia en séquence

Quelle est la meilleure façon de gérer la durée de chaque opération avant d'appeler la suivante? (pour une photo, imaginez un UIAlertView qui l'abandonne après quelques secondes de retard, pour un film, imaginez plutôt un MPMoviePlayerController)

J'appelle déjà la méthode qui analyse le tableau avec un NSOperation.

IMPORTANT: Il semble que le MPMovieController ne soit pas lu (l'interface n'apparaît même pas) qu'il soit appelé dans une NSOperation. Est-ce que quelqu'un d'autre a rencontré ce problème?

MISE À JOUR L'utilisation performSelectorOnMainThread: rend le travail de MPMoviePlayer comme prévu

Répondre

1

Ceci est la solution que j'ai réussi à trouver. Je l'affiche dans le cas où quelqu'un est intéressé. D'abord je mets toutes mes 'actions multimédias' dans un NSOperationQueue et je mets le maxConcurrentOperationCount à 1, donc je suis sûr qu'elles seront exécutées de manière asynchrone à partir du thread principal mais seulement une à la fois dans un ordre FIFO (ceci est très important que vous vouliez que votre contenu ne se chevauche pas sur l'écran).

Ensuite, pour chaque action, je l'active d'une manière particulière en fonction de sa classe/nature. Supposons que, il y a trois types d'actions:

  1. UIAlertViews sous-classes
  2. MPMoviePlayerController-comme
  3. actions d'arrière-plan (actions qui ne concernent pas le contenu multimédia apparaître instantanément sur la vue actuelle

Pour les deux premiers j'utilise NSNotifications pour gérer la file d'attente puisque je ne sais pas quand le contenu s'arrêtera de jouer ou sera rejeté par l'utilisateur (supposons au toucher) .Pour chacun de ceux-ci:

  • Pause l'exécution de la file d'attente avec setSuspended:YES
  • Ajouter un observateur pour le corrisponding NSNotification
  • Jouer le contenu
  • Poster une notification quand ils ont fini de jouer
  • Retirez l'observateur et commencer à nouveau la file d'attente avec setSuspended:NO

Pour un UIAlertView la notification est postée avec un performSelector:withObject:afterDelay: indiquant le temps hall soit affiché ou après un double tap. Pour A MPMovieController, il est lancé automatiquement et est nommé MPMoviePlayerPlaybackDidFinishNotification. Les types UIAlertView et MP doivent être lus sur le thread principal.

Le troisième type peut être un ensemble d'instructions simplement exécutées dans l'opération NSInvocationOperation placée dans la file d'attente.Je peux même créer des actions comme 'wait' qui suspend l'exécution de la file d'attente pendant quelques secondes