我正在使用 AVAudioPlayer 在我的 iPhone 应用程序中播放音乐。
在我写的一个类中,我有一个包含随机升序整数的数组。(2, 4, 9, 17, 18, 20,...) 这些整数表示歌曲中某个事件应该发生的时间。所以如果你取上面的数组,在歌曲播放 2 秒后,应该调用一些方法。4 秒后,应调用另一个方法。等等。
我尝试使用重复的 NSTimer:
NSTimer *myTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timerTick) userInfo:nil repeats:YES];
每次触发时,它都会检查 Audioplayer 的值和当前 arrayindex 的值是否相同:
- (void) timerTick {
if([[myArray objectAtIndex:currentIndex] intValue] == (int)(player.currentTime)) {
//here the event-method is called
currentIndex++;
}
}
这段代码实际上有效,但仅在一段时间内有效。然而,一段时间后,myTimer 和控制音乐播放器的计时器不同步。所以它错过了 myArray 的一个元素并开始了一个无限循环。我不知道它们不同步的确切原因,但我认为这可能是因为计时器和播放器没有在完全相同的时间启动,或者可能是因为短暂的性能滞后。
我想我必须以一种完全不同的方式来处理这个问题。键值观察是一种方法吗?我可以将我的类作为观察者添加到播放器对象,以便在 player.currentTime 值更改时收到通知。但这会导致发送大量通知,我认为这对性能非常不利。
非常感谢任何帮助!