Вскоре у меня есть NSDictionary
с URL-адресами изображений, которые мне нужно показать в моем UITableView
. У каждой ячейки есть заголовок и изображение. Я успешно добился этого, хотя прокрутка задерживалась, так как казалось, что клетки загружали свое изображение каждый раз, когда они появлялись на экране. Я поискал немного и нашел SDWebImage
на github. Это заставило пропустить задержку прокрутки. Я не совсем уверен, что он сделал, но я полагал, что это было кеширование. Но! Каждый раз, когда я открываю приложение в первый раз, я не вижу изображений, и мне нужно прокрутить вниз и вернуться назад, чтобы они появились. И если я выхожу из приложения с помощью кнопки «Домой» и снова открываюсь, то кажется, что кеширование работает, потому что изображения на экране видны, однако, если я прокручиваю одну ячейку вниз, в следующей ячейке нет изображения. Пока я не прокручу его и не вернусь назад, или пока я не нажму на него. Это как должно работать кеширование? Или как лучше всего кэшировать изображения, загруженные из Интернета? Изображения обновляются редко, поэтому я был близок к тому, чтобы просто импортировать их в проект, но мне нравится иметь возможность обновлять изображения без загрузки обновления ..
Невозможно ли загрузить все изображения для всего tableview из кеша (учитывая, что в кеше что-то есть) при запуске? Поэтому я иногда вижу клетки без изображений?
И да, мне сложно понять, что такое кеш.
--EDIT--
Я пробовал это только с изображениями одинакового размера (500x150), и ошибка аспекта исчезла, однако, когда я прокручиваю вверх или вниз, во всех ячейках есть изображения, но сначала они ошибочны. После того, как ячейка находится в поле зрения в течение нескольких миллисекунд, появляется правое изображение. Это ужасно раздражает, но, может быть, как это должно быть? .. Похоже, что сначала он выбирает неправильный индекс из кеша. Если я прокручиваю медленно, я вижу, как изображения мигают с неправильного изображения на правильное. Если я прокручиваю быстро, я считаю, что неправильные изображения видны всегда, но я не могу сказать из-за быстрой прокрутки. Когда быстрая прокрутка замедляется и в конечном итоге останавливается, неправильные изображения по-прежнему отображаются, но сразу после прекращения прокрутки происходит обновление до правильных изображений. У меня также есть собственный класс UITableViewCell
, но я не внес никаких серьезных изменений ... Я еще не очень много изучал свой код, но я не могу придумать, что может быть не так ... Может быть, у меня что-то есть в неправильный порядок ... Я много программировал на java, c #, 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;
}
cellRowRowAtIndexPath
и что-нибудь еще, что может быть здесь актуально? Кэширование - это просто сохранение того, к чему вы ожидаете снова получить доступ, в более доступном месте для ускорения последующего доступа. В этом случае кэширование означает, что ваше приложение должно фактически сохранять данные изображения для каждой ячейки после ее загрузки в первый раз, а затем просто повторно использовать их каждый раз, когда необходимо отобразить эту конкретную ячейку (это то, что SDWebImage должен делать для ты). - person Dima   schedule 16.07.2012cell.imageView.image
прямо перед первымdispatch_async
. - person Rob   schedule 17.07.2012