2012-03-23 2 views
2

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

- (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; 

} 
+0

Checkout UIImageLoader. Он делает именно то, что вы хотите, и только два файла для добавления в xcode. Это также очень легко понять, и в репо есть два отличных примера. https://github.com/gngrwzrd/UIImageLoader – gngrwzrd

ответ

1

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

проверка Кроме этого, связанный ответ на заикание изображения: Non-lazy image loading in iOS

+1

Большое спасибо. Я смотрю Grand Central Dispatch и нашел хороший пример проекта здесь (https://github.com/SlaunchaMan/GCDExample) –

4

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

- (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]; 
} 

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

+0

Спасибо, я попробую, как только смогу! Есть ли что-то еще, что мне нужно сделать, кроме копирования и вставки кода? Извините, у меня нет большого опыта работы с UITableViews :) –

+0

Не то, чтобы я мог думать. Он должен работать как первый шаг. Следующий шаг - это попытка изменить вашу модель, это упростит и ускорит работу в методе кэширования изображений. – danh

+0

@danh self.issues = [NSArray arrayWithArray: self.issues]; должен быть self.issues = [NSArray arrayWithArray: updatedIssues]; правильно? – OzBoz

Смежные вопросы