Лучший способ кэшировать изображения в приложении iOS?

Короче говоря, у меня есть NSDictionaryс URL-адресами изображений, которые мне нужно показать в моем UITableView. Каждая ячейка имеет заголовок и изображение. Я успешно сделал это, хотя прокрутка отставала, так как казалось, что ячейки загружали свое изображение каждый раз, когда они появлялись на экране. Я немного поискал и нашел SDWebImageна github. Это заставило прокрутку -запаздывать. Я не совсем уверен, что он сделал, но я полагал, что он сделал какое-то кэширование. Но! Каждый раз, когда я открываю приложение в первый раз, я не вижу изображений, и мне приходится прокручивать вниз и обратно, чтобы они появились.А если я выйду из приложения кнопкой домой -, и снова открою, то вроде кэширование работает, потому что изображения на экране видны, однако, если я прокручиваю одну ячейку вниз, то в следующей ячейке нет изображение. Пока я не прокрутлю его и не вернусь назад, или если я не нажму на него. Так должно работать кэширование? Или как лучше всего кэшировать изображения, загруженные из Интернета? Изображения обновляются редко, поэтому я был близок к тому, чтобы просто импортировать их в проект, но мне нравится иметь возможность обновлять изображения без загрузки обновления..

Нельзя ли загрузить все изображения для всего tableview из кеша (, учитывая, что при запуске в кеше )что-то есть? Поэтому я иногда вижу клетки без изображений?

И да, мне трудно понять, что такое кеш.

--РЕДАКТИРОВАТЬ--

Я пробовал это только с изображениями одного размера (500x150 ), и ошибка аспекта -исчезла, однако, когда я прокручиваю вверх или вниз, во всех ячейках есть изображения, но сначала они неправильные. После того, как ячейка находится в поле зрения несколько миллисекунд, появляется правильное изображение. Это ужасно раздражает, но, может быть, так и должно быть?.. Похоже, сначала он выбирает неправильный индекс из кеша. Если я прокручиваю медленно, я вижу, как изображения мигают с неправильного изображения на правильное. Если я прокручиваю быстро, то я считаю, что неправильные изображения видны все время, но я не могу сказать из-за быстрой прокрутки. Когда быстрая прокрутка замедляется и в конце концов останавливается, неправильные изображения все еще появляются, но сразу после того, как прокрутка прекращается, она обновляется до правильных изображений. У меня также есть пользовательский класс UITableViewCell, но я не внес никаких больших изменений. Я еще не очень много просмотрел свой код, но я не могу понять, что может быть не так.. Может быть, у меня что-то есть в неправильном порядке. Я много программировал на java, c #, php и т. д., но мне трудно понять цель -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;
}
49
задан Venk 28 May 2013 в 23:30
поделиться