2010-11-16 41 views
7

J'ai un fichier audio qui doit disparaître lorsque l'utilisateur fait défiler un UIScrollView. Cependant, toute méthode performSelector:withObject:afterDelay: est bloquée jusqu'à ce que l'utilisateur arrête de défiler. J'ai donc essayé de créer un code pour effectuer une fadeout sur un autre thread:Comment faire pour masquer un AVAudioPlayer sur un thread d'arrière-plan?

- (void)fadeOut 
{ 
    [NSThread detachNewThreadSelector:@selector(fadeOutInBackground:) toTarget:self withObject:self.audioPlayer]; 
} 

- (void)fadeOutInBackground:(AVAudioPlayer *)aPlayer 
{ 
    NSAutoreleasePool *myPool = [[NSAutoreleasePool alloc] init]; 
    [self performSelector:@selector(fadeVolumeDown:) withObject:aPlayer afterDelay:0.1]; 
    [myPool release]; 
} 

- (void)fadeVolumeDown:(AVAudioPlayer *)aPlayer 
{ 
    aPlayer.volume = aPlayer.volume - 0.1; 
    if (aPlayer.volume < 0.1) { 
     [aPlayer stop];   
    } else { 
     [self performSelector:@selector(fadeVolumeDown:) withObject:aPlayer afterDelay:0.1]; 
    } 
} 

Il obtient jusqu'à la performSelector, mais pas plus loin parce que je suppose qu'il essaie d'exécuter sur un fil, il n'a pas accès. Je ne peux même pas le changer pour performSelector:onThread:withObject:waitUntilDone: parce qu'il n'y a pas d'option de délai.

Des idées? Pourquoi ont-ils rendu si difficile de faire disparaître un son? moan

Merci!

Répondre

14

J'ai résolu un problème similaire en planifiant le sélecteur dans un mode de boucle d'exécution différent de celui par défaut. De cette façon, il n'interfère pas avec les événements de défilement. Utilisation de la NSRunLoopCommonModes a fonctionné pour moi:

[self performSelector:@selector(fadeVolumeDown:) 
      withObject:aPlayer 
      afterDelay:0.1 
       inModes:[NSArray arrayWithObject: NSRunLoopCommonModes]]; 
+2

génie absolu. Merci! :) – jowie

+0

Divin! merci @MartinCote! –

0

Inspiré par la réponse ci-dessus

while (theAudio.volume > 0.000000) 
     [self fadeVolumeDown]; 

- (void) fadeVolumeDown{ 
    theAudio.volume -=0.01; 
}