2012-05-15 3 views
0

Я ищу, чтобы выполнить некоторый код после того, как звук закончил игру, но не знаю, как лучше всего это сделать. Я посмотрел на performSelectorOnMainThread...., но не совсем понял это - даже тогда я не уверен, что это лучший способ подойти к проблеме. Я хочу изменить цвет текста метки после того, как мой звук закончил игру. Я был бы рад помочь. Мой код ниже:Лучший способ выполнить код ПОСЛЕ того, как звук закончил играть

-(void) playWordSound:(UILabel *)label 
{ 
    NSString *path; 
    SystemSoundID soundId; 
    switch (label.tag) 
    { 
     case 1: 
      path = [[NSBundle mainBundle] pathForResource:@"humpty" ofType:@"wav"]; 
      break; 
     case 2: 
      path = [[NSBundle mainBundle] pathForResource:@"dumpty" ofType:@"wav"]; 
      break; 
     case 3: 
      path = [[NSBundle mainBundle] pathForResource:@"saty" ofType:@"wav"]; 
      break; 
     case 4: 
      path = [[NSBundle mainBundle] pathForResource:@"on 2" ofType:@"wav"]; 
      break; 
     case 5: 
      path = [[NSBundle mainBundle] pathForResource:@"a 3" ofType:@"wav"]; 
      break; 
     case 6: 
      path = [[NSBundle mainBundle] pathForResource:@"wall" ofType:@"wav"]; 
      break; 
    } 
     NSURL *url = [NSURL fileURLWithPath:path]; 
     AudioServicesCreateSystemSoundID((CFURLRef)objc_unretainedPointer(url), &soundId); 
    AudioServicesPlaySystemSound(soundId); 
    //this is where i want to change the color of the label 
} 

ответ

2

Используйте AVPlayerItem и добавить наблюдателя для AVPlayerItemDidPlayToEndTimeNotification событий.

например.

...

AVPlayerItem* playerItem = [AVPlayerItem playerItemWithAsset:asset]; 
[playerItem addObserver:self forKeyPath:@"status" options:0 context:&ItemStatusContext]; 
[[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(playerItemDidReachEnd:) 
              name:AVPlayerItemDidPlayToEndTimeNotification 
              object:playerItem]; 
player = [AVQueuePlayer playerWithPlayerItem:playerItem]; 
[player play]; 

...

- (void)playerItemDidReachEnd:(NSNotification *)notification { 
    // Do stuff here 
} 

....

+0

Спасибо за ваш ответ. У меня есть '#import #import ' в моем .h файле, но я получаю некоторые ошибки - 'itemStatusContext' и' player' оба бросают необъявленные ошибки идентификатора – garethdn

+0

Вам нужно только AVFoundation, но вы должны объявить все свои переменные, код выше всего лишь фрагмент, вам все равно нужно объявить «AVQueuePlayer * player» и «static const NSString * ItemStatusContext». Ознакомьтесь с руководством системы воспроизведения в документах Xcode. – codeghost

0

Этот метод может помочь вам:

OSStatus AudioServicesAddSystemSoundCompletion (
    SystemSoundID       inSystemSoundID, 
    CFRunLoopRef       inRunLoop, 
    CFStringRef        inRunLoopMode, 
    AudioServicesSystemSoundCompletionProc inCompletionRoutine, 
    void         *inClientData 
);