6

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

这是现在用于加载图像的代码片段:

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];
}

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

4

1 回答 1

7

查看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;
}
于 2010-06-10T08:54:04.483 回答