Ios AVPlayer边界时间观察者偶尔无法触发

Ios AVPlayer边界时间观察者偶尔无法触发,ios,observer-pattern,avplayer,Ios,Observer Pattern,Avplayer,我使用AVPlayer的-addBoundaryTimeOserverForTimes:queue:usingBlock:在视频中的特定时间执行一些代码(在这种情况下,我希望在视频达到持续时间时取消隐藏按钮。代码如下: - (void)viewWillAppear:(BOOL)animated { ... _player = [AVPlayer playerWithURL:videoURL]; AVPlayerLayer *newPlayerLayer = [AVPl

我使用AVPlayer的-addBoundaryTimeOserverForTimes:queue:usingBlock:在视频中的特定时间执行一些代码(在这种情况下,我希望在视频达到持续时间时取消隐藏按钮。代码如下:

- (void)viewWillAppear:(BOOL)animated
{
    ...

    _player = [AVPlayer playerWithURL:videoURL];

    AVPlayerLayer *newPlayerLayer = [AVPlayerLayer playerLayerWithPlayer:_player];
    [newPlayerLayer setFrame:_videoView.bounds];
    [_videoView.layer addSublayer:newPlayerLayer];

    _observer = [_player addBoundaryTimeObserverForTimes:@[[NSValue valueWithCMTime:_player.currentItem.duration]] queue:NULL usingBlock:^{
        [someButton setHidden:NO];
    }];

    ...
}
无论出于何种原因,有时代码块触发,按钮变为可见,有时则不可见。我们无法找到这种行为的模式。这种情况经常(几乎总是)在模拟器中发生,有时在设备上也会发生。有人遇到过这个问题吗?知道会发生什么吗

编辑


另外,如果我在块上放置断点,它总是激发。

主队列有时不调用。 您可以使用子队列,并在子队列的块中调用主队列

// dispatch queue setting
dispatch_queue_t subQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);

// notification setting
__block id blockObserver;
blockObserver = [self.queuePlayer addBoundaryTimeObserverForTimes:boundary
                 queue:subQueue // if NULL use mainQueue

  usingBlock:^{
    // do something
    dispatch_queue_t mainQueue = dispatch_get_main_queue();
    dispatch_async(mainQueue, ^{
        // do something
    });
}];

对于那些想要观察玩家何时结束的人:

我大约每年浏览一次这个问题,因为我总是忘记对我有效的修复。这一次我在macOS上遇到了这个问题。。我看到了同样的行为,观察者块有时不会被调用。当我从正在调试的应用程序切换回Xcode时,该块会突然触发。这可能会被重新调用与在块中设置断点相关,如OP所述

不过,这里有一个解决方法:只需切换到中所述的
AVPlayerItemDidPlayToEndTimeNotification
。但是,请注意,由于名称暗示通知的对象是玩家的当前项目,而不是玩家本身


因为此通知在项目的结束时间触发,而不是观察一些“边界时间”如果您需要项目实际结束时间以外的其他时间,即持续时间,只需设置项目的
forwardPlaybackEndTime

这里只是一个暗箱操作,但可能是因为有时观察者在另一个线程上触发,可能会尝试从主线程调用sethidden方法。队列参数设置为NULL时执行主队列上的阻塞看起来已经发生了。使用AVPlayerItemDidPlayToEndTimeNotification怎么样?我唯一能想到的是currentItem.duration的CMTime分辨率与观测者使用的不同。你能找到解决方案吗?我看到了类似的问题。只是插话而已说我正在经历这个问题,我不确定问题是什么。我已经有一段时间没有处理这个问题了,我无法测试这个问题并接受它作为正确答案。我应该结束这个问题吗?