0

JSON ファイルからいくつかの画像と文字列を解析しています。解析は正常に機能しますが、画像の読み込みが非常に遅くなります。UITableViewCellを押すと、UITableViewがコンテンツをより速く表示することに気付きました。誰かがその修正を知っていますか?

これが私が使用するコードです。CPU 使用率を低く抑えるために NSOperationQueue を使用します。

NSDictionary *dict;
    dict = [application objectAtIndex:indexPath.row];

    name = [dict objectForKey:@"name"];
    detileName = [dict objectForKey:@"detailName"];
    itmsLink = [dict objectForKey:@"itms-serviceLink"];
    icon = [dict objectForKey:@"icon"];
    developer = [dict objectForKey:@"developer"];
    version = [dict objectForKey:@"version"];
    category = [dict objectForKey:@"category"];
    rating = [dict objectForKey:@"rating"];
    ratingNumbers = [dict objectForKey:@"ratingNumber"];
    description = [dict objectForKey:@"description"];
    developerEmails = [dict objectForKey:@"developerEmail"];

    [downloadQueue addOperationWithBlock:^{

        cell.AppName.text = name;
        cell.category.text = category;
        cell.rater.text = [NSString stringWithFormat:@"(%@)", ratingNumbers];
        if ([rating intValue] == 1) {
            cell.rating.image = [UIImage imageNamed:@"1.png"];
        }
        if ([rating intValue] == 2) {
            cell.rating.image = [UIImage imageNamed:@"2.png"];
        }
        if ([rating intValue] == 3) {
            cell.rating.image = [UIImage imageNamed:@"3.png"];
        }
        if ([rating intValue] == 4) {
            cell.rating.image = [UIImage imageNamed:@"4.png"];
        }
        cell.itms = itmsLink;
        cell.AppIcon.image = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:icon]]];
        cell.number.text = [NSString stringWithFormat:@"%li", (long)indexPath.row + 1];
    }];
4

2 に答える 2

0

に入る画像を除いて、セルを表示するために必要なほとんどのデータを既に取得しているようですAppIcon.image。現在のセットアップ方法では、画像のダウンロードにより、セルをすぐに表示できなくなります。私の推測では、画像のダウンロードは最終的に完了しますが、ダウンロードの完了後にセルを強制的に再描画することはありません。セルをタップすると、セル自体が強制的に再描画されます。これが、説明した動作が見られる理由です。

既にダウンロードしたデータを使用してセルをすぐに提示し、画像のバックグラウンド ダウンロードを開始することをお勧めします。ダウンロードが完了したら、NSNotification を送信して適切なセルを更新できます。これを行うには、初期化中に URL を受け入れる NSOperation のサブクラスを作成し、その op をオペレーション キューに追加します。

すべての作業を自分で行いたくない場合は、AFNetworking を使用してブロックを使用して更新を行う UIImageView のカテゴリがあります。 https://github.com/zbowling/AFNetworkingPollTest/blob/master/ServerTest/UIImageView%2BAFNetworking.h

于 2013-10-17T18:21:43.910 に答える
0

@Nick Galassoが述べたように-セルを更新せず、セルポインターをブロックに渡すことは非常に悪い習慣です。UITableView実際にセルを再利用し、ダウンロードが完了したらセルポインターを再度取得する必要があるためです-下のセルに興味がありますNSIndexPathオブジェクトではなく、実際の

リンクの下: https://developer.apple.com/library/ios/samplecode/LazyTableImages/Introduction/Intro.html

画像の遅延読み込みに関する完璧なサンプル コードを見つけることができます。以下のフラグメントは、実際にビューを表示する部分を示しています。

UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
cell.imageView.image = downloadedImage;

ダウンロードクラスの完了ハンドラーで呼び出すことができます (Apple リンクの下のサンプルでカバーされています)。

于 2013-10-17T19:54:56.743 に答える