触发segue并在prepareForSegue:sender:
内执行代码时是否有时间限制?
我的意思是,假设我在里面,我正在触发AVPlayerViewController
,但是这个控制器需要一个必须异步下载的视频,所以在prepareForSegue:sender:
内我有这样的代码:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
AVPlayerVC *playerViewController = (AVPlayerVC *)[segue destinationViewController];
[self.onDemandResources loadResourcesWithTags:@[tag]
runOnCompletion:^{
NSString *pathBundle = [[NSBundle mainBundle] pathForResource:@"video" ofType:@"mp4"];
NSURL *videoURL = [NSURL fileURLWithPath:pathBundle];
AVPlayer *player = [AVPlayer playerWithURL:videoURL];
playerViewController.player = player;
[player play];
}];
}
我遇到的问题是[segue destinationViewController]
正在呈现,但视频从未播放过。我的印象是代码需要很长时间才能执行并且已经显示了segue。
有什么想法吗?
答案 0 :(得分:2)
很难为您提供完整且有效的解决方案,因为您只提供了prepareForSegue(_ :)函数。我不知道源视图控制器和目标视图控制器的详细信息。我的五美分。
块的问题在于它们经常在不同的队列中运行,因此准备segue会触发块,不会等待块完成,而是转移到下一个视图控制器。
我在您的代码中看到的是,控制新视图控制器的旧视图控制器正在播放您的电影文件。让新控制器中的播放器指向旧视图控制器中的同一播放器不会在屏幕上显示电影。您需要AVPlayerView才能在屏幕上显示您的电影。
由于我不熟悉消息“self.onDemandResources loadResourcesWithTags:@ [tag]”,我无法用阻止对此消息发表评论。但是,而不是说:
AVPlayer *player = [AVPlayer playerWithURL:videoURL];
playerViewController.player = player;
我会在块中建议以下代码:
playerViewController.videoURL = videoURL;
然后运行:
AVPlayer *player = [AVPlayer playerWithURL:videoURL];
在目标视图控制器“AVPlayerVC * playerViewController”中。
希望这有帮助。
答案 1 :(得分:0)
您应该在触发segue之前下载视频,但对于您的问题,我认为您没有时间限制