Приложение зависает при воспроизведении звука с помощью AVAudioPlayer

StackOverflow https://stackoverflow.com/questions/2145502

  •  23-09-2019
  •  | 
  •  

Вопрос

Я делаю приложение для дошкольников с несколькими мини-играми.Один из них предполагает поиск того, «что не так» на картинке.Например, если они нажмут на ребенка, играющего на улице, раздастся звук, ребенка уберут с улицы, а метка обновится до «Обнаружено 1/5 ошибок».Если они найдут их все, они перейдут к новому контроллеру представления с новыми ошибками трафика.

Все работает нормально... большую часть времени.Но время от времени приложение проигрывает пинг, а потом зависает.Я думаю, это связано с фактическим воспроизведением звука (с помощью AVAudioplayer), потому что, если я это закомментирую, кажется, что он работает каждый раз.

Функция, которая вызывается при обнаружении ошибки, выглядит следующим образом:

-(void)fantKnapp{

    NSLog(@"fant en knapp");
    int ant =[self.antall intValue];
    ant++;
    NSLog(@"antall %i",ant);
    self.antall=[NSNumber numberWithInt:ant];
    self.poeng.text=[NSString stringWithFormat: @"%i/5 funnet",ant];

    if(ant==5){
        NSLog(@"Du klarte alle!");
        klartAlleView.hidden=NO;
        spillIgjen.hidden=NO;
        nestebrettKnapp.hidden=NO;
        navtestAppDelegate *appDelegate=(navtestAppDelegate *)[[UIApplication sharedApplication] delegate];
        [appDelegate spillLyd:@"du_klarte_alle"];
    }
    else{
        navtestAppDelegate *appDelegate=(navtestAppDelegate *)[[UIApplication sharedApplication] delegate];
        [appDelegate spillLyd:@"cling_1"];
    }
}

Этот код находит «antall», текущее количество найденных ошибок (точек).Если все ошибки обнаружены, воспроизводится определенный звук (он всегда работает).Если нет, воспроизводится другой звук.Это делается путем вызова функции в файле appdelegate.

-(void)spillLyd:(NSString*) filnavn{
    NSString *audioFilePath=[[NSBundle mainBundle] pathForResource:filnavn ofType:@"aif"];
    NSURL *audioFileURL=[NSURL fileURLWithPath:audioFilePath];
    self.lydspiller=[[[AVAudioPlayer alloc] initWithContentsOfURL:audioFileURL error:nil] autorelease];
    [self.lydspiller prepareToPlay];
    [self.lydspiller play];
    NSLog(@"spiller lyden");
}

Это прекрасно работает в 49/50 случаях, но время от времени это не так.Самое смешное, что звук воспроизводится, но приложение зависает, а ярлык не обновляется (self.poeng.text=...).Но отображаются все комментарии NSLog, включая новое количество баллов.Я ожидаю, что это произойдет до того, как будет воспроизведен звук...

Это проблема с AVAudioplayer?Есть ли у кого-нибудь подобный опыт?Может ли кто-нибудь помочь мне в этом?Буду благодарен за любую помощь и предложения...

(И извините за норвежца.Наверное, от этого мне не легче будет помочь...)

Нет правильного решения

Другие советы

Вероятно, вам необходимо реализовать AVAudioPlayerDelegate методы, чтобы можно было попытаться перехватывать ошибки проигрывателя.Если делегат сообщает, что проигрыватель успешно завершил работу, даже если приложение зависло, то ошибка, скорее всего, не связана с проигрывателем.

Я сочувствую тебе.Немногие задачи по отладке вызывают большее разочарование, чем отслеживание определенной, но весьма непостоянной ошибки.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top