2

こんにちは、Web サービスから画像を取得し、その画像をテーブルビューにロードするアプリを開発しています。画像を非同期でロードしました。問題は、テーブルビューのスクロール中にアプリがクラッシュし、ログにメモリ受信警告が表示されることです。また、同じ画像が多くの行で繰り返されます。また、読み込みに時間がかかります。以下のコードを使用しました。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

{ static NSString *CellIdentifier = @"セル";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];

    /*   UILabel * cellLabel=[[UILabel alloc] initWithFrame:CGRectMake(0, 50, cell.frame.size.width-20, 45)];
     cellLabel.textColor=[UIColor blackColor];
     cellLabel.backgroundColor=[UIColor clearColor];
     cellLabel.tag=2;
     [cell.contentView addSubview:cellLabel];*/

    cell.selectionStyle=UITableViewCellSelectionStyleNone;

    cell.backgroundView=[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"list_iPhone.png"]];


    UIImageView *imv = [[UIImageView alloc]initWithFrame:CGRectMake(10,18, 48, 48)];
    imv.tag=4;
    imv.image=[UIImage imageNamed:@"ImagePlaceholder.png"];


    [cell.contentView addSubview:imv];

    UIImageView *arrwimv = [[UIImageView alloc]initWithFrame:CGRectMake(260,35, 14, 17)];
    arrwimv.image=[UIImage imageNamed:@"arrw_iPhone.png"];

    [cell.contentView addSubview:arrwimv];



    UILabel *descriptionLbl=[[UILabel alloc] initWithFrame:CGRectMake(100, 27, 450, 45)];
    descriptionLbl.font=[UIFont CITY311_TitleFontWithSize:18];
    descriptionLbl.tag=1;
    descriptionLbl.textAlignment=UITextAlignmentLeft;
    descriptionLbl.textColor=[UIColor blackColor];
    descriptionLbl.backgroundColor=[UIColor clearColor];
    [cell.contentView addSubview:descriptionLbl];

    UILabel *descriptionLbl2=[[UILabel alloc] initWithFrame:CGRectMake(100, 5, 450, 45)];
    descriptionLbl2.font=[UIFont CITY311_TitleFontWithSize:18];
    descriptionLbl2.tag=2;
    descriptionLbl2.textAlignment=UITextAlignmentLeft;
    descriptionLbl2.textColor=[UIColor blackColor];
    descriptionLbl2.backgroundColor=[UIColor clearColor];
    [cell.contentView addSubview:descriptionLbl2];


}
UIImageView *imv2=(UIImageView *)[cell.contentView viewWithTag:4];

dispatch_async(mainQueue, ^(void) {

    if(![[[issueArray objectAtIndex:indexPath.row]objectForKey:@"PhotoUrl"] isEqualToString:@""])
    {

        NSData *imageData = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:[[issueArray objectAtIndex:indexPath.row]objectForKey:@"PhotoUrl"]]];
        UIImage* image = [[UIImage alloc] initWithData:imageData];

        imv2.image = image;

    }


});


UILabel *lbl=(UILabel *)[cell.contentView viewWithTag:1];
lbl.text=[[issueArray objectAtIndex:indexPath.row] objectForKey:@"issueSubmittedDate"];


UILabel *lbl2=(UILabel *)[cell.contentView viewWithTag:2];
lbl2.text=[[issueArray objectAtIndex:indexPath.row] objectForKey:@"IssueName"];

return cell;

}

ビューで読み込みました

mainQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

.h ファイル内

dispatch_queue_t mainQueue;

メモリ警告 (クラッシュ) なしで画像を適切にロードするのを手伝ってください。事前に感謝します。

4

1 に答える 1

0

テーブルビューセルを再利用しています。セルが画面外に移動すると、オブジェクトを再利用できるように取り除かれます。dequeueReusableCellWithIdentifier を実行しているとき、既に画像が含まれている「古い」セルを取得できます。そのセルからデータを消去しないと、新しい画像がダウンロードされるまで古いデータ (画像) が表示されます。

if(cell==nil) 内では、セルのみを作成し、すべての行で同じになるプロパティを設定する必要があります。その下のデータを設定およびクリアします。

クラッシュは、最初のコールバックの準備が整う前に、セルがビューの外に移動され、他の行に再利用される可能性があるために発生する可能性があります。識別子を一意の値に設定してみてください。次のようなもの: NSString *CellIdentifier = [NSString stringWithFormat:@"Cell%d", indexPath.Row]; 行数が少ない場合にのみ、コードをそのようにしてください。そうしないと、メモリの問題が発生する可能性があります。

自分で修正しようとする代わりに、https://github.com/rs/SDWebImageのようなものを使用してみてください。

于 2013-01-03T13:00:40.317 に答える