0

私が取り組んでいる iPad アプリケーションに大きな問題があります。何が問題なのか説明します。

私は製品のリストを持っています。その製品を表示するテーブルビューがあります。横向きモードでは 1 つのセルに、縦向きモードでは 2 つのセルに 3 つの画像 (製品) を読み込もうとしています。そのために、コントローラークラスでこのコードを使用します

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
  UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"cell"];
  [cell setBackgroundColor:[UIColor clearColor]];

  dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND,  0ul);
  dispatch_async(queue, ^{

    for(int i = 0; i < self.cols; i++){
      int index = (indexPath.row * self.cols) + i;

      if([self.productList count] > 0 && index < [self.productList count]){
        Product *tmpProduct = nil;
        if([self.productList isKindOfClass:[NSMutableSet class]]){
          tmpProduct = (Product *)[[NSArray arrayWithArray:[((NSSet *)self.productList) allObjects]]  objectAtIndex:index];
        }else{
          tmpProduct = (Product *)[((NSArray *)self.productList) objectAtIndex:index];
        }

        int x = i * self.itemWidth + (50 * (i + 1));
        int y = 0;
        int imageWidth = self.itemWidth;
        int imageHeight = self.itemHeight - 45;

        UIView *awesomeView = [[UIView alloc] initWithFrame:CGRectMake(x, y, imageWidth, self.itemHeight)];
        awesomeView.backgroundColor = [UIColor clearColor];
        awesomeView.userInteractionEnabled = YES;
        awesomeView.tag = 700;

        UIImage *image;
        if([tmpProduct getImageFilePath]){
          image = [UIImage imageWithContentsOfFile:[tmpProduct getImageFilePath]];
        }else{
          image = [UIImage imageNamed:@"no-image.png"];
        }
        dispatch_sync(dispatch_get_main_queue(), ^{

          UIImageView *productImage = [[UIImageView alloc] initWithImage: image];
          CGRect frameRect = productImage.frame;
          frameRect.size.width = imageWidth;
          frameRect.size.height = imageHeight;
          productImage.frame = frameRect;
          productImage.contentMode = UIViewContentModeScaleAspectFill;
          productImage.tag = index;
          productImage.backgroundColor = [UIColor grayColor];
          productImage.contentMode = UIViewContentModeScaleAspectFit;

          [awesomeView addSubview:productImage];
          [cell.contentView addSubview:awesomeView];
          [cell setNeedsLayout];
        });

      }
    }
  });
  return cell;
}

セルが表示され、「cellForRowAtIndexPath」メソッドが呼び出されると、バックグラウンド キューが開始されることがわかります。1 つのセルに 3 つまたは 2 つの画像の「for」を開始します。行に基づいてそのセルの製品を取得します。画像の幅と高さと位置を計算します。1 つのヘルパー ビューを開始します。ロードイメージより。製品オブジェクトに画像が存在する場合は、製品画像を読み込みます。そうでない場合は、デフォルトの画像 (画像なし) を読み込みます。そのイメージ ビューをヘルパー ビューに配置します。その後、ヘルパー ビューをメイン キューのセルに読み込みます。(表示するものがもっとあるので、そのヘルパービュー「awesomeView」を使用します。いくつかのラベルがあり、この質問を簡素化するためにそれを削除しました)。

これは、私がどの問題を抱えているかを確認するために記録したYouTubeビデオです。上下にスクロールすると、非常に遅いことがわかります。スクリプトが次のセルをロードするたびに、数秒間フリーズします。YOUTUBE ビデオ: http://youtu.be/hE3KI0SVrPk

どこが間違っているのかわかりません。

キューを使用していくつかの組み合わせを試しましたが、キューを使用せずに試してみましたが、結果はほぼ同じです。

ありがとうございます。

4

1 に答える 1