代码之家  ›  专栏  ›  技术社区  ›  Duck

表演环节有时间限制吗?

  •  0
  • Duck  · 技术社区  · 8 年前

    当一个段被触发并且代码在内部执行时,是否有时间限制 prepareForSegue:sender: ?

    AVPlayerViewController 但此控制器需要一个视频,必须异步下载,因此,在内部 prepareForSegue:发件人: 我有一个这样的代码:

    - (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] 正在呈现,但视频从未播放。我的印象是,代码需要很长时间才能执行,而且段已经显示出来了。

    有什么想法吗?

    2 回复  |  直到 8 年前
        1
  •  2
  •   MacUserT    8 年前

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

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

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

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

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

    playerViewController.videoURL = videoURL;
    

    然后运行线路:

    AVPlayer *player = [AVPlayer playerWithURL:videoURL];
    

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

    希望这能有所帮助。

        2
  •  0
  •   CZ54    8 年前

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