我正在为学校项目制作一个简单的reddit应用程序。我正在加载我的
reddit通过json(例如http://www.reddit.com/.json)与AFNetworking
库的数据。
我正在使用原型单元显示每个reddit线程
包含用于帖子缩略图的UIImageView
。
我正在尝试使用AFNetworking
来延迟加载图片
setImageWithURLRequest
方法。
问题:当我向下滚动tableView时,应用程序启动时,所有缩略图都应该像懒散一样加载。当单元格不在视图中并向上滚动到它时,缩略图已被占位符图像替换 - 即使它在滚动过去之前加载了正确的缩略图。
来自cellForRowAtIndexPath
方法的相关代码。在setImageWithURLRequest
块
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"threadCell";
SubredditThreadCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
NSDictionary *tempDictionary = [self.subredditArrayFromAFNetworking objectAtIndex:indexPath.row];
NSDictionary *singleThreadDict = [tempDictionary objectForKey:@"data"];
if ( [[singleThreadDict objectForKey:@"thumbnail"] isEqualToString:@"nsfw"] ){
cell.postImageThumbnail.image = [UIImage imageNamed:@"NSFWIcon"];
}
else if ([[singleThreadDict objectForKey:@"thumbnail"] isEqualToString:@"self"]){
cell.postImageThumbnail.image = [UIImage imageNamed:@"selfIcon"];
}
else if ([[singleThreadDict objectForKey:@"thumbnail"] length] == 0){
cell.postImageThumbnail.image = [UIImage imageNamed:@"genericIcon"];
}
else{
NSURL *thumbURL = [NSURL URLWithString:[singleThreadDict objectForKey:@"thumbnail"] ];
[cell.postImageThumbnail setImageWithURLRequest:[NSURLRequest requestWithURL:thumbURL]
placeholderImage:nil
success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image)
{
if (request) {
[UIView transitionWithView:cell.postImageThumbnail
duration:1.0f
options:UIViewAnimationOptionTransitionCrossDissolve
animations:^{
[cell.postImageThumbnail setImage:image];
}
completion:NULL];
}
}
failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error)
{
NSLog(@"failure loading thumbnail");
}
];
}
return cell;
}
答案 0 :(得分:1)
下载图像时,不要直接更新单元格的postImageThumbnail。
相反,请使用– reloadRowsAtIndexPaths:withRowAnimation:
告诉UITableView仅刷新该单元格。
为了获得更好的性能,UITableView将在屏幕外滚动后重新使用一个单元格对象,以显示当前可见的不同数据。 (这就是为什么dequeueReusableCellWithIdentifier:
以“dequeueReusable”开头而不是“makeNew”的原因。这使得UITableView只创建了与可见的一样多的单元格,而不必创建和销毁与行中的行数相同的单元格。桌子。当您的网络请求成功时,cell
块捕获的success:
正用于显示另一行,而您正在覆盖 行的图像。< / p>