私はレートオブザーバーでAVPlayer
を持っています。私observeValueForKeyPath
方法でobserveValueForKeyPathでNSNotificationを送信
[self.player addObserver:self
forKeyPath:@"rate"
options:NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew
context:&RateContext];
、私は、プレイヤーが停止/開始されたときplayerLayer
スーパービューが知っているように通知を送信しようとしています。私videoStalled
で
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary<NSString *,id> *)change
context:(void *)context {
if ([keyPath isEqualToString:@"rate"]) {
if (self.player.rate == 0) {
[self.indicatorView startAnimating];
dispatch_async(dispatch_get_main_queue(), ^{
[[NSNotificationCenter defaultCenter] postNotificationName:@"playerStopped" object:nil];
});
[self videoStalled];
}else if (self.player.rate == 1){
[self.indicatorView stopAnimating];
//dispatch_async(dispatch_get_main_queue(), ^{
// [[NSNotificationCenter defaultCenter] postNotificationName:@"playerStarted" object:nil userInfo:dic];
//});
}
return;
}
映像のより多くが、その後[self.player play]
を呼び出してロードするまで、私は待ちます。通知の投稿をコメントアウトした場合にのみ、「レート」が呼び出され、ビデオは即座に再生されます。通知のコメントを外すと、「レート」は引き続き呼び出されますが、数秒後に再生されません。大きな遅れがどこから来ているかわからない
遅延は、ディスパッチからメインUIスレッドまでです。通知を送信するためにUIスレッドに実際にディスパッチする必要はありません。また、メイン(UI)スレッドにいない場合、 '[self.indicatorView stopAnimating]を呼び出すとアプリがクラッシュするはずです – Lefteris