これは、StackOver フローでの最初の投稿であり、英語が苦手です。私はiOSの初心者なので、少し遅いです。実際には、URL から 5 つのデータ (画像を含む) を解析したいと考えています。カスタムの tableView セルを使用します。カスタム セル (ラベル内) にプレーン テキストがはっきりと表示されますが、画像は表示されません。そのため、特定の ImageView に画像を読み込むために「dispatch_queue_t」を使用します。シミュレーターを実行すると、画像 (ロゴと背景) が次々と完全に表示されますが、シミュレーターをリセットすると問題が発生します。リセット後、1 つのイメージ (キューの最後のイメージ) がすべてのセル (合計 5) に読み込まれます。「viewDidLoad」で「parsingLoad」メソッドを呼び出して、viewController のロード時に 1 回だけロードするようにします。誰が私が何を間違えたのか教えてもらえますか?
これが私のコードです:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"FairListCustomCell";
FairListCustomCell *cell = (FairListCustomCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
{
NSArray *topLabelObject = [[NSBundle mainBundle] loadNibNamed:@"FairListCustomCell" owner:self options:nil];
for (id currentObject in topLabelObject)
{
if ([currentObject isKindOfClass:[UITableViewCell class]])
{
cell = (FairListCustomCell*) currentObject;
break;
}
}
}
cell.selectionStyle = UITableViewCellSelectionStyleNone;
currentFair = [fairs objectAtIndex:indexPath.row];
cell.fairNameLabel.text =currentFair.FairName;
cell.fairLocationLabel.text =currentFair.FairLocation;
cell.bookmarkImageView.image=[UIImage imageNamed:@"Favorite.png"];
cell.bookmarkImageView.tag=indexPath.row;
dispatch_queue_t imageQueueFairLogo = dispatch_queue_create("com.queue", NULL);
dispatch_async(imageQueueFairLogo, ^
{
dispatch_retain(imageQueueFairLogo);
UIImage *imageFairLogo = [UIImage imageWithData:[NSData dataWithContentsOfURL: [NSURL URLWithString:[currentFair FairLogo]]]];
dispatch_async(dispatch_get_main_queue(), ^
{
cell.fairLogoImageView.image = imageFairLogo;
#if NEEDS_DISPATCH_RETAIN_RELEASE
dispatch_release(imageQueueFairLogo);
#endif
});
});
dispatch_queue_t imageQueueFairCellBackGround = dispatch_queue_create("com.queue", NULL);
dispatch_async(imageQueueFairCellBackGround, ^
{
dispatch_retain(imageQueueFairCellBackGround);
UIImage *imageFairCellBackGround = [UIImage imageWithData:[NSData dataWithContentsOfURL: [NSURL URLWithString:[currentFair FairCellBackGround]]]];
dispatch_async(dispatch_get_main_queue(), ^
{
cell.fairCellBackGround.image = imageFairCellBackGround;
#if NEEDS_DISPATCH_RETAIN_RELEASE
dispatch_release(imageQueueFairCellBackGround);
#endif
});
});
return cell;
}
また、別のけん引方法も試します。1 つ目 :- 両方の画像に "global_queue" を使用 (ここではサンプルとして 1 つだけ)、次のようにします。
imageQueueFairCellBackGround = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(imageQueueFairCellBackGround, ^
{
dispatch_retain(imageQueueFairCellBackGround);
UIImage *imageFairCellBackGround = [UIImage imageWithData:[NSData dataWithContentsOfURL: [NSURL URLWithString:[currentFair FairCellBackGround]]]];
dispatch_async(dispatch_get_main_queue(), ^
{
cell.fairCellBackGround.image = imageFairCellBackGround;
#if NEEDS_DISPATCH_RETAIN_RELEASE
dispatch_release(imageQueueFairCellBackGround);
#endif
});
});
return cell;
2番目:- このように:
dispatch_queue_t fairCellBackGroundcallerQueue = dispatch_get_current_queue();
dispatch_queue_t fairCellBackGrounddownloadQueue = dispatch_queue_create("Thumb downloader", NULL);
dispatch_async(fairCellBackGrounddownloadQueue, ^
{
UIImage *imageFairCellBackGround = [UIImage imageWithData:[NSData dataWithContentsOfURL: [NSURL URLWithString:[currentFair FairCellBackGround]]]];
dispatch_async(fairCellBackGroundcallerQueue, ^
{
cell.fairCellBackGround.image = imageFairCellBackGround;
});
});
dispatch_release(fairCellBackGrounddownloadQueue);
しかし、まだ解決していません。誰かが解決策を持っている場合は、私と共有してください。ありがとうございます。