我宣布一个对象为:
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];
}
我该如何删除观察者?
答案 0 :(得分:3)
正如[AVPlayer addPeriodicTimeObserverForInterval]
doc所述,您必须保留返回值,以便以后能够删除观察者。
所以你需要在类接口中添加一个属性
@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;
}];
在dealloc中,您可以释放观察者
- (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;
}];