まもなく、 にNSDictionary
表示する必要がある画像の URL がありますUITableView
。各セルにはタイトルと画像があります。セルが画面に入るたびに画像をダウンロードしたように見えたため、スクロールが遅れていましたが、これをうまく実現できました。ちょっと探したら出てきたSDWebImage
githubで。これにより、スクロールラグがなくなりました。それが何をしたのかは完全にはわかりませんが、何らかのキャッシングを行っていると信じていました。しかし!初めてアプリを開くたびに、画像が表示されず、下にスクロールして戻る必要があります。また、ホームボタンでアプリを終了して再度開くと、画面上の画像が表示されているため、キャッシュが機能しているように見えますが、1 つのセルを下にスクロールすると、次のセルには画像がありません。スクロールして元に戻るまで、またはクリックするまで。これはキャッシングがどのように機能するはずですか?または、Web からダウンロードした画像をキャッシュする最良の方法は何ですか? 画像はめったに更新されないので、プロジェクトにインポートするだけに近かったのですが、更新をアップロードせずに画像を更新できるようにしたいと思っています..
起動時にテーブルビュー全体のすべての画像をキャッシュからロードすることは不可能ですか(キャッシュに何かがある場合)? 画像のない細胞が時々見えるのはそのためですか?
はい、キャッシュとは何かを理解するのに苦労しています。
- 編集 -
同じサイズ (500x150) の画像のみでこれを試したところ、縦横エラーはなくなりましたが、上下にスクロールするとすべてのセルに画像がありますが、最初は間違っています。セルが数ミリ秒間表示された後、右の画像が表示されます。これは驚くほど面倒ですが、どうすればいいのでしょうか?.. 最初はキャッシュから間違ったインデックスを選択しているようです。ゆっくりスクロールすると、画像が間違った画像から正しい画像に点滅するのがわかります。速くスクロールすると、常に間違った画像が表示されると思いますが、スクロールが速いためわかりません。高速スクロールが遅くなり、最終的に停止すると、依然として間違った画像が表示されますが、スクロールが停止した直後に正しい画像に更新されます。私にも風習がありますUITableViewCell
クラスですが、大きな変更は行っていません..まだコードをあまり調べていませんが、何が間違っているのかわかりません..多分私は間違った順序で何かを持っています.. java、c#、php などで多くのプログラムを作成しましたが、Objective-c を理解するのに苦労してい.h
ます.m
。
@interface FirstViewController : UITableViewController{
/**/
NSCache *_imageCache;
}
(他の変数の中で) in FirstViewController.h
. これは正しくありませんか?
ここに私のcellForRowAtIndexPath
.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"hallo";
CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
{
cell = [[CustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
NSMutableArray *marr = [hallo objectAtIndex:indexPath.section];
NSDictionary *dict = [marr objectAtIndex:indexPath.row];
NSString* imageName = [dict objectForKey:@"Image"];
//NSLog(@"url: %@", imageURL);
UIImage *image = [_imageCache objectForKey:imageName];
if(image)
{
cell.imageView.image = image;
}
else
{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSString* imageURLString = [NSString stringWithFormat:@"example.com/%@", imageName];
NSURL *imageURL = [NSURL URLWithString:imageURLString];
UIImage *image = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:imageURL]];
if(image)
{
dispatch_async(dispatch_get_main_queue(), ^{
CustomCell *cell =(CustomCell*)[self.tableView cellForRowAtIndexPath:indexPath];
if(cell)
{
cell.imageView.image = image;
}
});
[_imageCache setObject:image forKey:imageName];
}
});
}
cell.textLabel.text = [dict objectForKey:@"Name"];
return cell;
}