在AVAudioPlayer播放之前做一些事情

时间:2013-08-22 09:30:07

标签: iphone ios objective-c avaudioplayer

我遇到了AVAudioPlayer的问题。 我想在声音播放之前为UICollectionView的单元格着色,但是使用此代码我无法执行此操作。

我认为改变背景的操作比播放声音的指令慢,因此单元格不会改变背景颜色。

int randomNumber = (arc4random() % [soundArray count]);
self.audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:[soundArray objectAtIndex:randomNumber] error:&error];
self.audioPlayer.delegate = self;
if(!self.audioPlayer){
    NSLog(@"Error creating player: %@", error);
}
 else{
    CGColorRef colorRef = [[cellArray objectAtIndex:randomNumber] backgroundColor];
    [[cellArray objectAtIndex:randomNumber] setBackgroundColor:(__bridge CGColorRef)([UIColor blackColor])];

    [self.audioPlayer play];
    sleep([self.audioPlayer duration]);

    [[cellArray objectAtIndex:randomNumber] setBackgroundColor:colorRef];
}

3 个答案:

答案 0 :(得分:1)

首先,我假设在你的问题的标题中,“之后”你的意思是“之前”。

但是,我认为您的问题与使用sleep()功能有关。它的问题是它会阻止你指定的时间执行。 iOS中的所有UI修改(包括背景颜色中的一个)都不会立即执行,但是当您将控制权返回到当前的RunLoop时(粗略地说,只是为了让您理解:在您的方法返回后的某个时间) )。通过使用睡眠,您将延迟每次更新,这会导致问题。 一般来说,睡眠不是你想要使用的,因为你真的不想阻止执行!

我建议你摆脱睡眠并使用 - 例如 - NSTimer s:它们不会阻挡任何东西。或者,您可以将注意力转移到AVAudioPlayer(如John Woods所说)的委托机制,以便在您完成游戏后重置背景颜色。

答案 1 :(得分:0)

做你想做的事情的最好方法是让你的班级成为AVAudioPlayerDelegate并使用

audioPlayerDidFinishPlaying:successfully:

当玩家完成时,系统会自动调用该方法。它将为您提供最可靠,最高效的整体性能。

答案 2 :(得分:0)

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(itemDidFinishPlaying)name:AVPlayerItemDidPlayToEndTimeNotification object:songItem];

你可以设置Notification Center ..在Song完成播放后会激活...“itemDidFinishPlaying”是你要调用的方法... songItem是AVPlayerItem ..