Кэширование изображений в UITableView - PullRequest
2 голосов
/ 23 марта 2012

Я загружаю картинки в табличное представление, которые соответствуют тексту ячейки, поэтому каждое изображение отличается.Когда пользователь прокручивает страницу вниз, iOS должна вручную перезагружать каждое изображение с SSD, поэтому прокрутка очень прерывистая.Как я могу кэшировать изображения или предотвратить пересоздание ячеек табличного представления?У других проблемы были решены с помощью imageNamed:, поскольку iOS автоматически кеширует ваши изображения, но я загружаю изображения из каталога документов, а не из пакета приложения.Что я должен делать?Спасибо.

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {

    // Return the number of sections.
    return 1;

}


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

    // Return the number of rows in the section.
    return [issues count];

}

// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {

        cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];

    }


    // Set up the cell...
    NSDictionary *dic = [self.issues objectAtIndex:indexPath.row];

    cell.text = [dic objectForKey:@"Date"];

    cell.imageView.image = [UIImage imageWithContentsOfFile:[NSString stringWithFormat:@"%@/issues/%@/cover.png", documentsDirectory, [dic objectForKey:@"Directory Name"]]];

    return cell;

}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {

        return 150;

}

Ответы [ 2 ]

4 голосов
/ 23 марта 2012

Этот массив словарей является вашей моделью, поэтому он будет естественным местом.Сложная часть делает вашу модель изменчивой.Вы можете сделать свою модель изменчивой в классе, или прыгать через обручи, когда вы кэшируете изображение.Я бы порекомендовал первый, но закодировал его здесь, чтобы он соответствовал существующему коду ...

- (UIImage *)imageForIndexPath:(NSIndexPath *)indexPath {

    NSDictionary *dic = [self.issues objectAtIndex:indexPath.row];
    UIImage *image = [dic valueForKey:@"cached_image"];

    if (!image) {
        image = [UIImage imageWithContentsOfFile:[NSString stringWithFormat:@"%@/issues/%@/cover.png", documentsDirectory, [dic objectForKey:@"Directory Name"]]];
        NSMutableDictionary *updatedDictionary = [NSMutableDictionary dictionaryWithDictionary:dic];
        [updatedDictionary setValue:image forKey:@"cached_image"];
        NSMutableArray *updatedIssues = [NSMutableArray arrayWithArray:self.issues];
        [updatedIssues replaceObjectAtIndex:indexPath.row withObject:[NSDictionary dictionaryWithDictionary:updatedDictionary]];
        self.issues = [NSArray arrayWithArray:updatedIssues];
    }
    return image;
}

Это будет нестабильно при первой прокрутке списка, а затем сгладит после.Если вы не хотите, чтобы в первый раз выполнялись рубки и имели небольшую задержку, прежде чем появится представление, вы можете опередить модель и увеличить нагрузку:

for (int i=0; i<self.issues.count; i++) {
    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:i inSection:0];
    (void)[self imageForIndexPath:indexPath];
}

Последнее, другое решениеявляется изменяемым массивом, соответствующим вашему массиву проблем.Это может быть просто прекрасно, но чаще всего я рад, что включил в свою модель некоторые кэшированные вычисления.Если вы обнаружите, что используете этот массив проблем в другом месте, вы будете рады, что у вас есть все изображения, о которых позаботились.

1 голос
/ 23 марта 2012

Наряду с кэшированием вы можете также рассмотреть возможность загрузки изображений в фоновом режиме с помощью Grand Central Dispatch. Когда ячейка загружена, поместите UIActivityIndicator и замените его изображением в отдельном потоке.

Также проверьте этот связанный ответ для заикания изображения: Не ленивая загрузка изображений в iOS

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...