У меня есть 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];
}
Что лучшим способом являются к "ленивой загрузке" изображения в каждой ячейке, чтобы не изолировать в прокрутке?
Взгляните на репозиторий 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;
}