我遵循了有关如何使用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属性后管理跟踪?
提前致谢,
答案 0 :(得分:7)
你没有做错任何事。
我也试过这样做,但它不会开火。
我必须使用NSTimer
而不是轮询当前时间:(
答案 1 :(得分:1)
仅当调用者直接更改值时,KVO才会触发AVAudioPlayer上的currentTime属性。当音频剪辑进展时它不会触发。要跟踪它,您必须使用NSTimer,正如deanWombourne已经建议的那样。
答案 2 :(得分:0)
你试过吗
// KVO [self setValue:[NSNumber numberWithFloat:currentTime] forKey:@“currentTime”];
当currentTime改变时,我做了这个,而且KVO工作正常。但它仍然需要一个计时器来告诉设置值=。=