Лучший способ кэшировать изображения в приложении 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;
}

Ответы на вопрос(7)

Ваш ответ на вопрос