Ленивая загрузка отображает для UITableViewCells от NSDocumentDirectory?

У меня есть a 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];
}

Что лучшим способом являются к "ленивой загрузке" изображения в каждой ячейке, чтобы не изолировать в прокрутке?

6
задан Emil 22 January 2013 в 09:59
поделиться

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;
}
7
ответ дан 17 December 2019 в 00:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: