Я использую 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];
Каждый раз при запуске проверяется, совпадают ли значения аудиоплеера и текущего индекса массива:
- (void) timerTick {
if([[myArray objectAtIndex:currentIndex] intValue] == (int)(player.currentTime)) {
//here the event-method is called
currentIndex++;
}
}
Этот код действительно работает, но только в течение некоторого времени. Однако через некоторое время myTimer и таймер, который управляет музыкальным проигрывателем, не синхронизированы. Поэтому он пропускает элемент myArray и начинается бесконечный цикл. Я не знаю точно, почему они не синхронизированы, но я думаю, что это может быть из-за того, что таймер и проигрыватель не запускаются в одно и то же время или, возможно, из-за коротких задержек производительности.
Я думаю, что должен подходить к этому совершенно по-другому. Наблюдает ли ключ-значение способ сделать это? Я мог бы добавить свой класс в качестве наблюдателя к объекту player, чтобы он получал уведомления при изменении значения player.currentTime. Но это приведет к отправке МНОГО уведомлений, и я думаю, что это будет очень плохо для производительности.
Любая помощь высоко ценится!