私が取り組んでいる 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
どこが間違っているのかわかりません。
キューを使用していくつかの組み合わせを試しましたが、キューを使用せずに試してみましたが、結果はほぼ同じです。
ありがとうございます。