7

内のテーブルビューでインターネットからいくつかの画像を読み込んでいますcellForRowAtIndexPath。これが私のコードです:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *MyIdentifier = @"ArticleCell";
    ArticleCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier];
    Article *article = [parser items][indexPath.row];

    cell.title.text = article.title;
    cell.newsDescription.text = article.description;
    [cell.image setImageWithURL:[NSURL URLWithString:article.image]];

    return cell;
}

私の問題は、を使用しても、SDWebImage下にスクロールすると、アプリがまだ遅れていることです。からのスクリーンショットを次に示しますInstruments

ここに画像の説明を入力

ここに画像の説明を入力

4

5 に答える 5

5

画像のダウンロードはバックグラウンド スレッドで実行されているように見えますが、画像データの処理はメイン スレッドで行われるため、アプリケーションがブロックされます。SDWebImage が提供する非同期イメージ ダウンローダーを試すことができます。

[SDWebImageDownloader.sharedDownloader downloadImageWithURL:imageURL
                                                    options:0
                                                   progress:^(NSUInteger receivedSize, long long expectedSize)
                                                   {
                                                       // progression tracking code
                                                   }
                                                   completed:^(UIImage *image, NSData *data, NSError *error, BOOL finished)
                                                   {
                                                       if (image && finished)
                                                       {
                                                           // do something with image
                                                       }
                                                   }
];

メソッドでは、次のようになります。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *MyIdentifier = @"ArticleCell";
    ArticleCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier];
    Article *article = [parser items][indexPath.row];

    cell.title.text = article.title;
    cell.tag = indexPath.row;
    cell.newsDescription.text = article.description;
    [SDWebImageDownloader.sharedDownloader downloadImageWithURL:imageURL
                                                        options:0
                                                       progress:nil
                                                      completed:^(UIImage *image, NSData *data, NSError *error, BOOL finished)
     {
         if (cell.tag == indexPath.row && image && finished)
         {
            dispatch_async(dispatch_get_main_queue(), ^(){
               cell.image = image;
            });

         }
     }];

    return cell;
}
于 2013-10-30T13:25:15.947 に答える
1

これはおそらく、ネットワーク アクティビティとはあまり関係がなく、画像サイズと関係があります。特に整数以外の乗数の場合、画像のサイズ変更はコストがかかります。画像が配置先のビューよりもかなり大きい場合は、サイズを変更してバックグラウンド スレッドでキャッシュし、キャッシュされたコピーをビューから参照する必要があります。

これが問題であるかどうかを確認するには、すべてのイメージを手動でダウンロードし、ローカル コピーを参照してください。私が正しければ、あなたの UITableView はまだ同じように遅れます。

于 2013-10-30T13:57:06.460 に答える
1

次のように、別のスレッドで画像をダウンロードします。

NSURLRequest *request = [NSURLRequest requestWithURL:yourURL];
                        [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
                            if ( data )
                            {
                                UIImage *image = [[UIImage alloc] initWithData:data];
                                [cell.image setImage:image];
                            }
                        }];
于 2013-10-29T10:03:44.580 に答える
0

画像を確認し、種類とサイズを確認してください。さらに重要なことは、1 つまたは複数の画像がそのファイル形式によって破損していないかどうかです。ファイルサイズが大きすぎる、不規則な (大きすぎる) 境界?

疑わしい画像ファイルを画像エディターで開いて再保存し、内部ファイル形式に問題がないことを確認してください。

于 2013-10-30T13:14:21.217 に答える