0 votes

Comment savoir si la sortie d'un lecteur de films est terminée ?

J'ai pour objectif de libérer un lecteur de film (theMovie) puis de lancer une autre action (appelée playButtonClicked) après qu'il ait été complètement libéré. J'ai utilisé performSelector pour retarder le "playButtonClicked" d'une seconde et cela fonctionne bien. Le code est le suivant :

[theMovie release] ; [self performSelector:@selector(playButtonClicked) withObject:nil afterDelay:1] ;

Cependant, je ne veux pas toujours retarder d'une seconde. Je veux lancer le "playButtonClicked" dès que "theMovie" est complètement relâché. J'ai essayé le code suivant, mais cela ne fonctionne pas car [timer userInfo] n'est jamais nul. Quelqu'un sait-il comment vérifier que la libération d'un film est terminée ?

[theMovie release];
//[self performSelector:@selector(playButtonClicked) withObject:nil afterDelay:1];

NSTimer *atimer =   [NSTimer scheduledTimerWithTimeInterval:0.1 target:self 
                                                  selector:@selector(waitForReleaseFinish:)
                                                  userInfo: (MPMoviePlayerController*) theMovie repeats:YES];

Le code de waitForRleaseFinish : (NSTimer *)timer est le suivant :

if ([timer userInfo]==nil)  //here I actually want to test if (theMovie==nil),but I don't know how to do and I'm not sure if it is a correct way to determine the release finished.
{
     [timer invalidate];
    [self playButtonClicked];
}

J'ai hâte de recevoir de l'aide. Merci.

1voto

Mk12 Points 6588

Ce n'est pas nécessaire.

Si vous relâchez le lecteur et appelez ensuite playButtonClicked, comme ceci :

[theMovie release];
[self playButtonClicked];

Il n'exécutera pas la deuxième ligne tant que la première n'est pas terminée, ou tant que theMovie n'est pas lancé. Tout ceci se passe sur le même thread et s'exécutera dans l'ordre. Vous n'avez pas besoin d'une minuterie pour cela. Cependant, dans les situations où ce que vous attendez pour terminer s'exécute sur un nouveau thread, vous utiliserez un callback, plutôt que de deviner le temps que cela prendra (qui est bien inférieur à 1 seconde !).

De plus, pour éviter tout malentendu, la "libération complète" consiste simplement à soustraire le retainCount de un. Il sera automatiquement désalloué lorsqu'il atteindra zéro.

Juste en passant, pourquoi est-il important que theMovie soit libéré (deallocated ?) avant que playButtonClicked soit exécuté ?

De même, votre code waitForReleaseFinish : serait fonctionne, mais c'est inutile car le film serait libéré avant la création du timer.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X