【问题标题】:Creating video preview on iCarousel using PFFiles from Parse IOS使用 Parse IOS 中的 PFFiles 在 iCarousel 上创建视频预览
【发布时间】:2015-12-16 21:17:12
【问题描述】:

我创建了一个 iCarousel 视图并尝试在每个“单元格”/视图中显示视频预览。

我将视频存储在 Parse 中并正在尝试

  1. 云端查询
  2. 从 PFFile 中检索数据
  3. 将数据转换为 URL
  4. 使用 AVPlayer 播放 URL

到目前为止,这是我的代码。

-(void)getPast{
dataArray = [[NSMutableArray alloc]init];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
PFQuery *query = [PFQuery queryWithClassName:@"History"];
[query whereKey:@"Location" containsString:[defaults objectForKey:@"location"]];
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
    pastArray = [NSMutableArray arrayWithArray:objects];
    for (PFObject *files in objects){
        PFFile *file = [files objectForKey:@"File"];
        [file getDataInBackgroundWithBlock:^(NSData *data, NSError *error) {

            [dataArray addObject:data];

        }];
    }
    [self.carouselView reloadData];
}];
}

我收到一条错误消息,说我的 dataArray 为空, 我认为这里的问题可能是因为我在后台查询,所以 For 循环在我收到数据之前就完成了,因此数组是空的,尽管我可能是错的,我不知道如何解决这个问题即使我是对的。

显示预览的代码

 - (UIView *)carousel:(iCarousel *)carousel viewForItemAtIndex:(NSUInteger)index reusingView:(UIView *)view {



        PFObject *object = [pastArray objectAtIndex:index];
        NSData *data = [dataArray objectAtIndex:index];
        NSString *dataString = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
        NSURL *URL = [NSURL URLWithString:dataString];
        NSLog(@"URL %@",URL);
        view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 200, 275)];
        self.playerViewController = [[AVPlayerViewController alloc]init];
    self.playerViewController.player = [AVPlayer playerWithURL:URL];
    self.playerViewController.view.frame = view.bounds;
    self.playerViewController.showsPlaybackControls = NO;


    [view addSubview:self.playerViewController.view];
    view.autoresizesSubviews = YES;

    self.playerViewController.player.actionAtItemEnd = AVPlayerActionAtItemEndNone;
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playerItemDidReachEnd:) name:AVPlayerItemDidPlayToEndTimeNotification object:self.playerViewController.player.currentItem];
    [self.playerViewController.player play];



    return view;


    }

如何修复我的代码,以便每个视图自动播放与其在数组中的索引相对应的 PFFile 视频。

我的问题: 数组为空

无法为每个视图播放内容

附言。我知道我没有使用 PFObject *object。

【问题讨论】:

    标签: objective-c parse-platform avplayer icarousel avplayerviewcontroller


    【解决方案1】:

    正如您所猜测的那样,for 循环在调用块之前完成它的执行方式,您必须确保在调用 reloadData 之前加载数据

    关于如何处理这个问题,我首先想到的是

    for (PFObject *files in objects){
        PFFile *file = [files objectForKey:@"File"];
        [file getDataInBackgroundWithBlock:^(NSData *data, NSError *error)   {
    
            [dataArray addObject:data];
            [self checkData];
        }];
    } 
    
    
    - (void)checkData {
       //Check the if the data is completed
       if(dataArray.count == numberOfFiles) { //Maybe a more complex if is required here but you get the idea
           //All files are downloaded
           dispatch_async(dispatch_get_main_queue(), ^{
              //We are sure the data is ready so we reload it
              [self.carouselView reloadData];
           });
       }
    }
    

    另外你应该总是在加载之前检查 NSData 是否有效

    【讨论】:

    • 我如何在预览视图中显示视频?对我来说,我要么一无所获,要么得到一个带有一条线的播放按钮。如何将数据转换为 URL 并让每个视图播放其特定视频?谢谢!
    • 您说您的问题是一个空数组,现在您正在讲述一个不同的问题,您应该提出一个新问题或使用更多信息更新您当前的问题
    • 我的问题是“如何修复我的代码,以便每个视图自动播放与其在数组中的索引相对应的 PFFile 视频”。我有两个问题,我认为我知道问题的数组问题,但我不知道如何将其转换为可以在 AVPlayer 中播放的 URL
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多