Как я могу исчезнуть AVAudioPlayer в фоновом потоке? - PullRequest
7 голосов
/ 16 ноября 2010

У меня есть аудиофайл, который должен исчезнуть, пока пользователь прокручивает UIScrollView.Однако любой метод performSelector:withObject:afterDelay: блокируется до тех пор, пока пользователь не прекратит прокрутку.Итак, я попытался создать некоторый код для выполнения затухания в другом потоке:

- (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];  
    }
}

Достигается так же далеко, как PerforSelector, но не дальше, потому что я предполагаю, что он пытается выполнить в потоке, у которого нет доступак.Я даже не могу изменить его на performSelector:onThread:withObject:waitUntilDone:, потому что нет опции задержки.

Есть идеи?Почему им так трудно просто затухать? Стон

Спасибо!

Ответы [ 2 ]

14 голосов
/ 16 ноября 2010

Я решил похожую проблему, запланировав селектор в режиме, отличном от режима по умолчанию.Таким образом, это не мешает прокрутке событий.Использование NSRunLoopCommonModes у меня сработало:

[self performSelector:@selector(fadeVolumeDown:) 
           withObject:aPlayer
           afterDelay:0.1 
              inModes:[NSArray arrayWithObject: NSRunLoopCommonModes]];
0 голосов
/ 12 ноября 2017

Вдохновленный ответом выше

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

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