AFNetworking setImageWithURLRequest在滚动过去时恢复为占位符

时间:2013-05-16 02:41:51

标签: iphone objective-c afnetworking

  • 我正在为学校项目制作一个简单的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;
}

1 个答案:

答案 0 :(得分:1)

下载图像时,不要直接更新单元格的postImageThumbnail。

相反,请使用– reloadRowsAtIndexPaths:withRowAnimation:告诉UITableView仅刷新该单元格。

为了获得更好的性能,UITableView将在屏幕外滚动后重新使用一个单元格对象,以显示当前可见的不同数据。 (这就是为什么dequeueReusableCellWithIdentifier:以“dequeueReusable”开头而不是“makeNew”的原因。这使得UITableView只创建了与可见的一样多的单元格,而不必创建和销毁与行中的行数相同的单元格。桌子。当您的网络请求成功时,cell块捕获的success:正用于显示另一行,而您正在覆盖 行的图像。< / p>