Создание превью видео на iCarousel с использованием PFFiles из Parse IOS

Я создал представление iCarousel и пытаюсь отобразить предварительный просмотр видео в каждой «ячейке»/представлении.

У меня есть видео, хранящиеся в Parse, и я пытаюсь

  1. Запрос из облака
  2. Получить данные из PFFile
  3. Преобразование данных в URL
  4. Воспроизвести URL с помощью AVPlayer

Вот мой код до сих пор.

-(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.


person huddie96    schedule 16.12.2015    source источник


Ответы (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 перед его загрузкой.

person Benjamin Jimenez    schedule 16.12.2015
comment
Как показать видео в режиме предварительного просмотра? Для меня либо я ничего не получаю, либо кнопка воспроизведения с перечеркнутой линией. Как я могу преобразовать данные в URL-адрес и заставить каждое представление воспроизводить свое конкретное видео? Спасибо! - person huddie96; 17.12.2015
comment
вы сказали, что ваша проблема была пустым массивом, и теперь вы говорите о другой проблеме, вы должны задать новый вопрос или обновить свой текущий вопрос с дополнительной информацией - person Benjamin Jimenez; 17.12.2015
comment
Мой вопрос заключался в том, как я могу исправить свой код, чтобы каждый просмотр автоматически воспроизводил видео PFFile, соответствующее его индексу в массиве. У меня было две проблемы: проблема с массивом, и я думал, что знаю проблему, и я не знал, как преобразовать ее в URL-адрес, который можно было бы воспроизвести в AVPlayer. - person huddie96; 17.12.2015