执行 segue 有时间限制吗?

Is there some time limit with perform segue?

触发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。

有什么想法吗?

你应该在触发segue之前下载视频,但对于你的问题,我认为你没有时间限制

很难给你一个完整有效的解决方案,因为你只提供了 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"。

希望对您有所帮助。