我有一个对象声明为:
AVQueuePlayer *queuePlayer;
在代码中,我添加了一个观察者:
- (void) playStreamedTrack: (Track *) track {
[queuePlayer addObserver:self forKeyPath:@"status" options:0 context:nil];
[queuePlayer addPeriodicTimeObserverForInterval:CMTimeMakeWithSeconds(1, NSEC_PER_SEC)
queue:nil
usingBlock:^(CMTime time) {
progress = time.value/time.timescale;
}];
}
我试着按照如下方式删除观察者,但无法正常工作
- (void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self];
[queuePlayer removeObserver:self forKeyPath:@"status" context:nil];
}
如何删除观察者?
如[AVPlayer addPeriodicTimeObserverForInterval]
文档所述,您必须保留返回值,以便以后能够删除观察器。
因此,您需要在类接口中添加一个属性
@property (nonatomic, strong) id playerObserver;
并在创建观察者时存储返回值
if(self.playerObserver)
[queuePlayer removeTimeObserver:self.playerObserver];
self.playerObserver = [self.queuePlayer addPeriodicTimeObserverForInterval:CMTimeMakeWithSeconds(1, NSEC_PER_SEC)
queue:nil
usingBlock:^(CMTime time) {
progress = time.value/time.timescale;
}];
在解除锁定中,您可以释放观察者
- (void)dealloc {
[queuePlayer removeTimeObserver:self.playerObserver];
[queuePlayer removeObserver:self forKeyPath:@"status" context:nil];
}
请注意,在您的块中,您可能需要使用对实例的弱引用,以避免保留循环。如果您的"进度"变量实际上是一个实例变量,那么您必须使用像以下这样的弱引用:
__typeof__(self) __weak weakSelf = self;
self.playerObserver = [self.queuePlayer addPeriodicTimeObserverForInterval:CMTimeMakeWithSeconds(1, NSEC_PER_SEC)
queue:nil
usingBlock:^(CMTime time) {
weakSelf.progress = time.value/time.timescale;
}];