我创建了一个iCarousel View,并尝试在每个“单元格”/视图中显示视频预览。
我将视频存储在Parse中并尝试
到目前为止我的代码。
-(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 *对象。
答案 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是否有效