Ленивая загрузка изображений для UITableViewCells из NSDocumentDirectory? - PullRequest
6 голосов
/ 10 июня 2010

В моем приложении есть 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];
}

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

1 Ответ

7 голосов
/ 10 июня 2010

Взгляните на 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...