Лучший способ кэшировать изображения в приложении IOS?
Вскоре у меня естьNSDictionary
с URL для изображений, которые мне нужно показать в моемUITableView
, Каждая ячейка имеет заголовок и изображение. Я успешно сделал это, хотя прокрутка запаздывала, так как казалось, что клетки загружали свое изображение каждый раз, когда они появлялись на экране.
Я искал немного, и нашелSDWebImage
на github. Это заставило прокрутку отставать. Я не совсем уверен, что это сделало, но я полагал, что это кешировало.
Но! Каждый раз, когда я открываю приложение в первый раз, я не вижу изображений, и мне приходится прокручивать их вниз и обратно, чтобы они появились. И если я выхожу из приложения с помощью кнопки home и снова открываюсь, то кажется, что кэширование работает, потому что изображения на экране видны, однако, если я прокручиваю одну ячейку вниз, то в следующей ячейке нет изображения. Пока я не прокручиваю мимо и не возвращаюсь назад, или если я нажимаю на это. Так должно работать кеширование? Или как лучше всего кэшировать изображения, загруженные из Интернета? Изображения обновляются очень быстро, поэтому я был близок к тому, чтобы просто импортировать их в проект, но мне нравится иметь возможность обновлять изображения без загрузки обновления.
Нельзя ли при запуске загрузить все изображения для всей таблицы из кеша (учитывая, что в кеше что-то есть)? Поэтому я иногда вижу клетки без изображений?
И да, мне трудно понять, что такое кеш.
--EDIT--
Я попытался сделать это только с изображениями одинакового размера (500x150), и ошибка аспекта исчезла, однако, когда я прокручиваю вверх или вниз, на всех ячейках появляются изображения, но сначала они ошибочны. После того, как ячейка была в поле зрения в течение нескольких миллисекунд, появляется правильное изображение. Это удивительно раздражает, но, может быть, как это должно быть? .. Кажется, что сначала он выбирает неправильный индекс из кэша. Если я прокручиваю медленно, то вижу, что изображения мигают с неправильного изображения на правильное. Если я выполняю быструю прокрутку, то считаю, что неправильные изображения видны всегда, но я не могу сказать из-за быстрой прокрутки. Когда быстрая прокрутка замедляется и в конечном итоге останавливается, неправильные изображения все равно появляются, но сразу после остановки прокрутки обновляются до нужных изображений. У меня тоже есть обычайUITableViewCell
класс, но я не произвел каких-либо значительных изменений ... Я еще не очень подробно просмотрел свой код, но я не могу думать о том, что может быть не так ... Возможно, у меня что-то не в том порядке ... У меня есть запрограммировано много на Java, C #, PHP и т. д., но я с трудом понимаю Objective-C, со всеми.h
а также.m
...
I have also `
@interface FirstViewController : UITableViewController{
/**/
NSCache *_imageCache;
}
(среди других переменных) вFirstViewController.h
, Это не правильно?
Вот мойcellForRowAtIndexPath
.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"hallo";
CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
{
cell = [[CustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
NSMutableArray *marr = [hallo objectAtIndex:indexPath.section];
NSDictionary *dict = [marr objectAtIndex:indexPath.row];
NSString* imageName = [dict objectForKey:@"Image"];
//NSLog(@"url: %@", imageURL);
UIImage *image = [_imageCache objectForKey:imageName];
if(image)
{
cell.imageView.image = image;
}
else
{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSString* imageURLString = [NSString stringWithFormat:@"example.com/%@", imageName];
NSURL *imageURL = [NSURL URLWithString:imageURLString];
UIImage *image = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:imageURL]];
if(image)
{
dispatch_async(dispatch_get_main_queue(), ^{
CustomCell *cell =(CustomCell*)[self.tableView cellForRowAtIndexPath:indexPath];
if(cell)
{
cell.imageView.image = image;
}
});
[_imageCache setObject:image forKey:imageName];
}
});
}
cell.textLabel.text = [dict objectForKey:@"Name"];
return cell;
}