从 NSDocumentDirectory 延迟加载 UITableViewCells 的图像?

Posted

技术标签:

【中文标题】从 NSDocumentDirectory 延迟加载 UITableViewCells 的图像?【英文标题】:Lazy load images for UITableViewCells from NSDocumentDirectory? 【发布时间】:2010-06-10 08:06:20 【问题描述】:

我的应用程序中有一个UITableView,我在其中从NSDocumentDirectory 加载了几张图像。它工作,但是当向上和向下滚动时,应用程序似乎有点冻结,很可能是因为主线程中提供的图像,有效地阻止了 tableView 滚动,直到它被加载。我的问题是我不知道以后如何在滚动时加载它们,这是一个“延迟加载”功能。

这是现在用于加载图像的代码 sn-p:

imagesPath = [NSString stringWithFormat:@"%@/images/", [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]];
if ([fileManager fileExistsAtPath:[imagesPath stringByAppendingPathComponent:[NSString stringWithFormat:@"/%d.png", rowID]]]) 
    UIImage *image = [[UIImage alloc] initWithContentsOfFile:[imagesPath stringByAppendingPathComponent:[NSString stringWithFormat:@"/%d.png", rowID]]];
    // If image contains anything, set cellImage to image. If image is empty, use default, noimage.png.
    if (image != nil)
        // If image != nil, set cellImage to that image
        cell.cellImage.image = image;
    
    [image release];

“延迟加载”每个单元格中的图像以避免滚动滞后的最佳方法是什么?

【问题讨论】:

【参考方案1】:

查看SDWebImage 存储库。它提供了执行异步图像加载的一切。

更新

我刚刚注意到 README 中有一些拼写错误,因此下载本地文件可能无法按预期工作。

这里是一些示例代码。视图控制器有一个 UIImageView 出口并且想要加载image.jpg 文件。它实现了SDWebImageManagerDelegate 协议:

- (IBAction)loadImage:(id)sender 
    SDWebImageManager *manager = [SDWebImageManager sharedManager];

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *destPath = [documentsDirectory stringByAppendingPathComponent:@"image.jpg"];
    NSURL *url = [NSURL fileURLWithPath:destPath];
    UIImage *cachedImage = [manager imageWithURL:url];
    if (cachedImage)
    
        imageView.image = cachedImage;
    
    else
    
        // Start an async download
        [manager downloadWithURL:url delegate:self];
        


- (void)webImageManager:(SDWebImageManager *)imageManager didFinishWithImage:(UIImage *)image

    imageView.image = image;

【讨论】:

我不是在尝试下载图像,而是在尝试从 NSDocumentDirectory 加载图像。 下载应该理解为访问任何NSURL支持的资源。 NSURL 可用于多种协议:http、ftp 或文件。将您的路径转换为 ​​NSURL 并“下载”您的本地文件。 我正在尝试,但它不起作用! NSURL 从字符串加载:file://var/mobile/Applications/RANDOMIDENTIFIER/Documents/images/10.png. 谢谢,这可能行得通,但我决定使用 SDWebImage 框架,这样我就不需要负责下载和存储图像了 :) 不过谢谢! @Laurent Etiemble:我正在传递来自应用程序文档目录的图像路径。现在,当我尝试运行该应用程序时,占位符图像会出现,但即使经过很长时间也不会加载真实图像

以上是关于从 NSDocumentDirectory 延迟加载 UITableViewCells 的图像?的主要内容,如果未能解决你的问题,请参考以下文章

iOS 文件检索 - NSDocumentDirectory

如何在单元测试(OCUnit)中访问 NSDocumentDirectory

用户升级 iPhone 时是不是传输 NSDocumentDirectory 中的文件

使用 NSDocumentDirectory 存储图像不起作用?

涉及 NSDocumentDirectory 和其他 iOS App 特定调用的静态库的单元测试

单例模式的实现——延迟初始化占位类替代双重检验加锁以达到延迟初始化和线程安全的目的。