Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios8 iOS 8未调用AvPlayerItemDidPlaytoEndTime通知_Ios8_Nsnotification_Avplayeritem - Fatal编程技术网

Ios8 iOS 8未调用AvPlayerItemDidPlaytoEndTime通知

Ios8 iOS 8未调用AvPlayerItemDidPlaytoEndTime通知,ios8,nsnotification,avplayeritem,Ios8,Nsnotification,Avplayeritem,我有上面的通知设置。当我用iOS 7运行测试时,它被调用得非常棒,然而,当我用iOS 8运行应用程序时,它从来没有被调用过 通过将观察者注册到速率键路径来解决该问题 AVPlayerItem *currentItem = self.player.currentItem; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playerItemDidReachEnd:) name:AVPlayerIte

我有上面的通知设置。当我用iOS 7运行测试时,它被调用得非常棒,然而,当我用iOS 8运行应用程序时,它从来没有被调用过

通过将观察者注册到速率键路径来解决该问题

AVPlayerItem *currentItem = self.player.currentItem;
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playerItemDidReachEnd:) name:AVPlayerItemDidPlayToEndTimeNotification object:currentItem];

投赞成票的答案不准确。这就是我必须做的:

[self.player addObserver:self forKeyPath:@"rate" options:0 context:nil];

- (void)observeValueForKeyPath:(NSString*)keyPath ofObject:(id)object change:(NSDictionary*)change context:(void*)context {
if (self.player.rate == 0.0) {
    CMTime time = self.player.currentTime;
    if (time >= duration) {
        //song reached end
    }
}

作为参考,我正在加载一个远程URL音频文件,不确定这是否会对公差产生任何影响。

这个答案对我来说更好-接受的答案是启动我的DidReachen方法twicecan您可以更改为swift吗?二进制表达式“CMTime”和“CMTime”的操作数无效
if ([keyPath isEqualToString:@"rate"]) {

    if (_player.rate == 0.0) {
        CMTime time = _player.currentTime;
        NSTimeInterval timeSeconds = CMTimeGetSeconds(time);
        CMTime duration = _player.currentItem.asset.duration;
        NSTimeInterval durationSeconds = CMTimeGetSeconds(duration);
        if (timeSeconds >= durationSeconds - 1.0) { // 1 sec epsilon for comparison
            [_delegate playerDidReachEnd:_player];
        }
    }
}