状态为AVKeyValueStatusFailed时,重新加载AVAsset中的密钥

我正在做以下事情:

  • 使用给定的URL创build一个新的AVAsset 。 该URL指向远程Web服务器上的video。
  • 尝试通过调用loadValuesAsynchronouslyForKeys:completionHandler:来加载tracks属性loadValuesAsynchronouslyForKeys:completionHandler:
  • 初始请求失败,因为没有互联网连接
  • 我注意到通过调用statusOfValueForKey:error:失败的请求statusOfValueForKey:error:
  • 然后等待连接重新出现(使用一些可达性代码)。 一旦这样做,我再次调用loadValuesAsynchronouslyForKeys:completionHandler:

这是问题出现的地方。 我会想象, AVAsset继续并尝试重新加载的轨道属性,因为它以前失败。 但是,这似乎并没有发生。 statusOfValueForKey:error:仍然会返回AVKeyValueStatusFailed ,尽pipe可用的互联网连接可用且video可播放。

有没有办法重置这个给定的属性的状态,并尝试另一个负载? 有没有其他的方法来解决这个问题?

  1. 你正在创build一个新的AVURLAsset或只是重复使用前一个?
  2. loadValuesAsynchronouslyForKeys:completionHandler:的完成处理程序中loadValuesAsynchronouslyForKeys:completionHandler:你是否调度回主线程?

如果您在准备重试时再次调用此方法(或类似方法)会发生什么情况。

 - (void)setContentURL:(NSURL *)contentURL { if (_contentURL != contentURL) { _contentURL = contentURL; AVURLAsset *asset = [AVURLAsset URLAssetWithURL:_contentURL options:nil]; NSArray *requestedKeys = [NSArray arrayWithObjects:ISIVideoPlayerControllerTracksKey, ISIVideoPlayerControllerPlayableKey, nil]; [asset loadValuesAsynchronouslyForKeys:requestedKeys completionHandler: ^{ dispatch_async(dispatch_get_main_queue(), ^{ [self prepareToPlayAsset:asset withKeys:requestedKeys]; }); }]; } }