是否可以使用观察者跟踪AVAudioPlayer对象?

时间:2011-12-14 09:15:54

标签: ios ios4 ios5

我遵循了有关如何使用KVO机制设置和观察者的文档 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 个答案:

答案 0 :(得分:7)

你没有做错任何事。

我也试过这样做,但它不会开火。

我必须使用NSTimer而不是轮询当前时间:(

答案 1 :(得分:1)

仅当调用者直接更改值时,KVO才会触发AVAudioPlayer上的currentTime属性。当音频剪辑进展时它不会触发。要跟踪它,您必须使用NSTimer,正如deanWombourne已经建议的那样。

答案 2 :(得分:0)

你试过吗

  

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

当currentTime改变时,我做了这个,而且KVO工作正常。但它仍然需要一个计时器来告诉设置值=。=