2

私はこのコードをやっています

しかし、私がスクロールすると、uitableview画像は、画像が一度読み込まれると、私が望むものが消えません。

これで何ができるか教えてください。

__block NSData *image = nil;
dispatch_queue_t imageQueue = dispatch_queue_create("queueForCellImage", NULL);
dispatch_async(imageQueue, ^{
    NSString *thumbnailURL = @"http://www.bizfy.com/demo/biscoot/a1.png";
    image = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:thumbnailURL]];
    dispatch_async(dispatch_get_main_queue(), ^{
        cell.imageView.image = [UIImage imageWithData:image];
        [cell setNeedsLayout];
    });
});
dispatch_release(imageQueue);
4

2 に答える 2

2

NSMutableDictionary以前にダウンロードした画像をまたはに保持するのではなく、をNSMutableArray使用することをお勧めしNSCacheます。と同様のインターフェイスを提供しますNSMutableDictionary(たとえば、setObject:forKey:メソッドがあります)が、キャッシュする画像の数を構成することもできます(countLimitまたは他のメカニズムを介して)。UIApplicationDidReceiveMemoryWarningNotificationまた、メモリ不足時にキャッシュを空にするためのオブザーバーを追加することもできます。

UITableView次のレベルに進みたい場合は、またはで使用されている画像をダウンロードするときに、次のUICollectionViewことを確認することをお勧めします。(a)画面からスクロールアウトした可能性のある画像よりも表示画像を優先する。(b)GCDグローバルキューなどを悩ます可能性のあるタイムアウトの問題を回避するために、同時実行の程度を制限するようにしてください。これを実現する最も簡単な方法(およびNSCache動作)は、確立された非同期画像検索UIImageViewカテゴリの1つを使用することです。 AFNetworkingまたはSDWebImageに含まれているものとして(またはアイデアの独自のバリエーションを実装します)。

于 2013-01-26T19:27:29.607 に答える
1

画像はNSArray、NSDictionary、さらにはファイルシステムに保存する必要があります。を設定するだけでなくcell.imageView、NSMutableArrayに保存するか、ディスクに保存してみてください。次回のcellForRowAtIndexPath呼び出し時に、保存したイメージにアクセスします。

ARCを使用していると仮定した場合のNSMutableDictionaryソリューションを使用したコード(理解してみてください):

インターフェイスファイルで、次のように宣言します。NSMutableDictionary *dictionaryImages;

実装ファイルで、次のviewDidLoadメソッドで開始します。dictionaryImages = [NSMutableDictionaryImages dictionary];

ここで、画像をダウンロードする場所で、画像を辞書に挿入する必要があります(すべてのコードを投稿するのではなく、その部分の関連部分のみを投稿します)

NSString *thumbnailURL = @"http://www.bizfy.com/demo/biscoot/a1.png";
UIImage *imageForDictionary = [UIImage imageWithData:image];
[dictionaryImages setObject:imageForDictionary forKey:thumbnailURL];

次に、cellForRowAtIndexPathが呼び出されたときに、それを画像に関連付けます(もちろん、thumbnailURLにアクセスできる場合)。

NSString *thumbnailURL = **get it from somewhere**;
UIImage *imageFromDictionary = [dictionaryImages objectForKey:thumbnailURL];
cell.imageView.image = imageFromDictionary;
于 2012-09-03T14:51:56.623 に答える