Вскоре у меня есть NSDictionary
с URL-адресами для изображений, которые мне нужно показать в моем UITableView
. Каждая ячейка имеет заголовок и изображение. Я успешно это сделал, хотя прокрутка отставала, так как казалось, что клетки загружали свое изображение каждый раз, когда они выходили на экран.
Я немного искал и нашел SDWebImage
в github. Это заставило прокрутить лагг. Я не совсем уверен, что он сделал, но я полагал, что он сделал некоторое кэширование.
Но! Каждый раз, когда я открываю приложение в первый раз, я вижу NO-изображения, и мне приходится прокручивать вниз и создавать резервные копии для их поступления. И если я выхожу из приложения с помощью домашней кнопки и снова открываю, то похоже, что кеширование работает, потому что изображения на экране видны, однако, если я прокручиваю одну ячейку вниз, то следующая ячейка не имеет изображения. Пока я не прокручу его и не вернусь, или если я нажму на него. Это как работает кеширование? Или каков наилучший способ кэширования изображений, загруженных из Интернета? Изображения обновляются, поэтому я был близок к тому, чтобы просто импортировать их в проект, но мне нравится иметь возможность обновлять изображения без загрузки обновления.
Невозможно загрузить все изображения для всего вида таблицы из кеша (учитывая, что что-то есть в кеше) при запуске? Поэтому я иногда вижу ячейки без изображений?
И да, я с трудом понимаю, что такое кеш.
- EDIT -
Я попробовал это только с изображениями того же размера (500x150), и аспект-ошибка ушла, однако при прокрутке вверх или вниз на всех ячейках есть изображения, но сначала они ошибаются. После того, как ячейка была на вид в течение нескольких миллисекунд, появится правильное изображение. Это удивительно раздражает, но может быть, как это должно быть?.. Кажется, он сначала выбирает неверный индекс из кеша. Если я прокручиваю медленно, то я вижу, что изображения мигают от неправильного изображения до правильного. Если я прокручу быстро, то я считаю, что неправильные изображения всегда видны, но я не могу сказать из-за быстрой прокрутки. Когда быстрая прокрутка замедляется и, в конце концов, останавливается, появляются неправильные изображения, но сразу же после прекращения прокрутки она обновляется до правильных изображений. У меня также есть пользовательский класс UITableViewCell
, но я не внес никаких больших изменений. Я еще не прошел мой код, но я не могу придумать, что может быть неправильным. Может быть, у меня что-то есть в неправильном порядке. Я много программировал в java, С#, php и т.д., но мне трудно понять Objective-c, со всеми .h
и .m
...
У меня также есть
@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;
}