在与对象解除锁定时删除observer



我有一个对象声明为:

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;
                                                                }];

最新更新