0

Я создал iCarousel View и пытаюсь отобразить предварительный просмотр видео в каждой ячейке/представлении.Создание предварительного просмотра видео на iCarousel с использованием PFFiles из Parse IOS

У меня есть видео, хранящиеся в синтаксический анализ и пытаюсь

  1. запроса из облака
  2. Получить данные из PFFile
  3. Преобразование данных в URL
  4. Play 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]; 
}]; 
} 

Im получаю ошибку о том, что мой DataArray пуст, Я думаю, что проблема здесь может быть, так как я запрашивая в фоновом режиме, цикл заканчивает прежде, чем я получил данные и, следовательно, массив пуст, хотя я могу ошибаться, и я не знаю, как это исправить, даже если бы я был прав.

Код для отображения предварительного просмотра

- (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, соответствующий индексу в массиве.

Мои проблемы: массив пуст

Воспроизведение содержимого для каждого вида не работает

Пс. Im знает, что я не использую объект PFObject *.

ответ

0

Как вы догадались для цикла заканчивает это выполнение путь до того, как блоки называются, вы должны убедиться, что данные загружены перед вызовом 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 действует перед загрузкой его

+0

Как показать видео в окне предварительного просмотра, хотя? Для меня либо я ничего не получаю, ни кнопка воспроизведения с строкой. Как я могу преобразовать данные в URL-адрес и получить каждое представление, воспроизводящее его конкретное видео? Благодаря! – huddie96

+0

вы сказали, что ваша проблема была пустым массивом, и теперь вы задаете другую проблему, вы должны задать новый вопрос или обновить свой текущий вопрос с дополнительной информацией. –

+0

Мой вопрос: «Как я могу исправить свой код, чтобы каждый просмотр автоматически запускал PFFile видео, соответствующее его индексу в массиве ». У меня было две проблемы с массивом, которые, как я думал, я знал о проблеме, и я не знал, как ее преобразовать в URL-адрес, который можно было бы воспроизвести в AVPlayer – huddie96

 Смежные вопросы

  • Нет связанных вопросов^_^