【问题标题】:Lazy load images in UITableView在 UITableView 中延迟加载图像
【发布时间】:2010-11-10 22:24:22
【问题描述】:

我的UITableView 中有大约 50 个自定义单元格。我想在从 URL 获取图像的单元格中显示图像和标签。

我想延迟加载图像,以便在加载图像时 UI 不会冻结。我尝试在单独的线程中获取图像,但每次单元格再次可见时我都必须加载每个图像(否则重用单元格会显示旧图像)。有人可以告诉我如何复制这种行为。

【问题讨论】:

  • 我希望对所有这些缓存组件进行性能比较。
  • 方式一:使用nsoperationqueue方式二:块编码方式三:库

标签: iphone ios objective-c uitableview


【解决方案1】:

试试AFNetworking类,在这个链接https://github.com/AFNetworking/AFNetworking下载这个类。在您的项目中添加所有 AFNetworking 类。然后只需导入此类别

#import "UIImageView+AFNetworking.h" in your Viewcontroller which contains your Tableview.

然后在 cellForRowAtIndexPath: 像下面这样放

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];

    if (cell == nil) 
    {
        cell = [[CustomCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];
    }

    [cell.imageView setImageWithURL:[NSURL URLWithString:[UrlArray objectAtIndex:indexPath.row]] placeholderImage:[UIImage imageNamed:@"placeholder.jpg"]];
     cell.myLabel.text = [imageNameArray objectAtIndex:indexPath.row];

     cell.selectionStyle = UITableViewCellSelectionStyleNone;

    return cell;    
}

这会异步下载 UITableviewcell 中的 imageView 的图像。当用户滚动 Tableview 时,它不会一次又一次地下载,因为它也有缓存。下载图像后,它会使用 imageUrl 的密钥保存图像。希望对你有用。

【讨论】:

    【解决方案2】:

    我建议去 NSOperation 并在另一个线程上做任何你需要的事情。

    这是我为图片加载写的一个类:

    - (id)initWithTarget:(id)trgt selector:(SEL)sel withImgURL:(NSString *)url {
        if(self = [super init]) {
            if(url == nil || [url isEqualToString:@""])
                return nil;
            target = trgt;
            action = sel;
            imgURL = [[NSURL alloc] initWithString: url];
        }
        return self;
    }
    
    - (void)main {
        [NSThread detachNewThreadSelector:@selector(loadImage) toTarget:self withObject:nil];
    }
    
    - (void)loadImage {
        NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
        UIImage *img = [UIImage imageNamed: @"default_user.png"];
        if(![[imgURL absoluteString] isEqualToString: @"0"]) {
            NSData *imgData = [NSData dataWithContentsOfURL: imgURL];
            img = [UIImage imageWithData: imgData];
        }
        if([target respondsToSelector: action])
            [target performSelectorOnMainThread: action withObject: img waitUntilDone: YES];
        [pool release];
    }
    
    - (void)dealloc {
        [imgURL release];
        [super dealloc];
    }
    

    希望有帮助!

    【讨论】:

      【解决方案3】:

      您可以使用自我图像按钮..您可以从 github 下载自我图像按钮文件...添加到您的项目中....

      在您的 xib 中的图像视图中更改类“自我图像按钮”...

      延迟加载称为同步请求..

      自我图像被称为异步请求。自我图像不等待响应..一次显示所有图像..

      【讨论】:

        【解决方案4】:

        也许你可以试试ALImageView。它比SDWebImage简单得多。你只需要两个源文件(ALImageView.h/ALImageView.m)。你可以重用图像视图在 tableview 单元格中重新加载不同的 url。

        1. 支持本地和内存缓存;
        2. 支持占位符;
        3. 支持点击触摸(target-action);
        4. 图像视图的支持角;

        还有一个很好的演示。

        【讨论】:

          【解决方案5】:

          你可以试试这个lazyTableImages


          我已经将这个项目的lazyTableImages 定制为一个非常简单的项目(customizeLazyTableImages)并删除了所有带有一些静态网址和标题的额外代码,只有这样才能非常顺利地加载图像并缓存它们


          【讨论】:

          • 我用这个,兄弟干得好,伙计。
          【解决方案6】:

          如果你想在视图开始时加载该图像,我认为还有另一种方法可以解决这个问题

          -(void)loadView 正在加载时,只需分配这些图像并将其放入nsarray 现在当表格单元格加载时,然后在表格单元格处查看并根据indexPath.row 只需替换这些@ 图像987654324@ 作为背景图像进入该视图,或使用表格视图单元格的nsarray 索引和indexPath.row 在表格单元格的新视图上创建这些图像的子视图。

          【讨论】:

          • 我正是需要这个解决方案。但我找不到任何示例源代码。有人有例子吗?
          【解决方案7】:

          您可以使用 NSOperation 队列或 GCD 在后台加载图像。

          如果你不想一次又一次地加载图片,你可以使用 NSCache 或者文件系统来存储图片。

          【讨论】:

            【解决方案8】:

            我不知道有任何内置方法可以实现这一点,但听起来你已经在使用另一个线程。

            假设您现在唯一剩下的问题是当单元格重新进入视图时使单元格的内容无效,您应该查看:

            - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
            

            通过实现这个委托方法,您可以在绘制之前检查单元格的内容,看看它是否需要新的内容。如果是这样,那么您可以清空单元格内容并再次触发您的线程加载。

            您也可以考虑发布一些代码。

            【讨论】:

              猜你喜欢
              • 2011-10-26
              • 1970-01-01
              • 2013-02-23
              • 1970-01-01
              • 1970-01-01
              • 2010-10-06
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多