0

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

有任何想法吗?

4

2 回答 2

2

很难为您提供完整且有效的解决方案,因为您只提供了 prepareForSegue(_:) 函数。我不知道源视图控制器和目标视图控制器的详细信息。这是我的五分钱。

块的问题是它们经常在不同的队列中运行,因此准备继续触发块,不等待块完成,而是继续到下一个视图控制器。

我在您的代码中看到的是,已将控制权授予新视图控制器的旧视图控制器正在播放您的电影文件。只是让新控制器中的播放器指向旧视图控制器中的同一个播放器并不会在屏幕上显示电影。你需要一个 AVPlayerView 来在屏幕上显示你的电影。

由于我不熟悉消息“self.onDemandResources loadResourcesWithTags:@[tag]”,因此无法使用块评论此消息。但是,而不是说:

AVPlayer *player = [AVPlayer playerWithURL:videoURL];
playerViewController.player = player;

我建议在块中使用以下代码:

playerViewController.videoURL = videoURL;

并运行该行:

AVPlayer *player = [AVPlayer playerWithURL:videoURL];

在目标视图控制器“AVPlayerVC *playerViewController”中。

希望这可以帮助。

于 2016-09-28T12:39:31.813 回答
0

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

于 2016-09-28T11:29:47.013 回答