使用Parse IOS中的PFFiles在iCarousel上创建视频预览

时间:2015-12-16 21:17:12

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

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

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

  1. 从云端查询
  2. 从PFFile
  3. 中检索数据
  4. 将数据转换为网址
  5. 使用AVPlayer播放网址
  6. 到目前为止我的代码。

    -(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;
    
    
        }
    

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

    我的问题: 数组为空

    播放每个视图的内容无效

    聚苯乙烯。我知道我没有使用PFObject *对象。

1 个答案:

答案 0 :(得分:0)

正如您猜测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之前,您应该始终检查NSData是否有效