【发布时间】:2009-10-26 10:15:52
【问题描述】:
我正在使用 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 值更改时收到通知。但这会导致发送大量通知,我认为这对性能非常不利。
非常感谢任何帮助!
【问题讨论】:
标签: iphone objective-c time sdk sequence