Можно ли отслеживать объект AVAudioPlayer с помощью наблюдателя? - PullRequest
2 голосов
/ 14 декабря 2011

Я следил за документами о том, как настроить и использовать наблюдатель, используя механизм КВО http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/KeyValueObserving/KeyValueObserving.html

Это должно быть очень просто.

Я создал объект AVAudioPlayer и хочу отслеживать после каждого изменения его текущего времени.

Я использую этот код для настройки наблюдателя:

[_player addObserver:self forKeyPath:@"currentTime" options:NSKeyValueObservingOptionNew context:NULL];

Этокод для обработки изменений:

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
if ([keyPath isEqualToString:@"currentTime"]) {
    //Do something
}}

И этот код, когда аудио заканчивается:

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag{
// Remove the observation
[_player removeObserver:self forKeyPath:@"currentTime"];}

По какой-то причине наблюдатель не вызывает -(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context

Я знаю, что могу использовать NSTImer и запускать его, когда начинается воспроизведение звука, но я ищу более плавный способ сделать это.Вместо этого я также могу использовать объект AVPlayer и отслеживать его, используя addPeriodicTimeObserverForInterval:queue:usingBlock: Но я не хочу терять все преимущества объекта AVAudioPlayer.

Что я делаю неправильно с наблюдателем?У вас есть другое предложение, как использовать AVAudioPlayer и управлять отслеживанием после его свойства currentTime?

Заранее спасибо,

Ответы [ 3 ]

7 голосов
/ 14 декабря 2011

Вы не делаете ничего плохого.

Я тоже пытался это сделать, и он просто не срабатывает.

Я должен был использовать NSTimer вместо того, чтобы опроситьcurrentTime: (

1 голос
/ 27 декабря 2013

KVO будет срабатывать для свойства currentTime в AVAudioPlayer, только когда вызывающая сторона изменяет значение напрямую. Он не сработает, когда аудиоклип будет прогрессировать. Чтобы отследить это, вам придется использовать NSTimer, как уже было предложено deanWombourne.

0 голосов
/ 12 марта 2013

Вы пробовали

// KVO [self setValue: [NSNumber numberWithFloat: currentTime] forKey: @ "currentTime"];

Я сделал это, когда currentTimeменяется, и KVO работает нормально. Но все равно нужен таймер, чтобы сообщить значение настройки =. =

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...