0

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 ビデオを自動再生するようにコードを修正するにはどうすればよいですか。

私の問題: 配列が空です

ビューごとのコンテンツの再生が機能しない

Ps。私は PFObject *object を使用していないことを認識しています。

4

1 に答える 1

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 が有効かどうかを常に確認する必要があります

于 2015-12-16T21:59:09.903 に答える