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 の値が変更されたときに通知を受けるようにすることができます。しかし、それでは大量の通知が送信されることになり、パフォーマンスに非常に悪いと思います。
どんな助けでも大歓迎です!