Опитвам се да заредя миниатюрни изображения от отдалечен сайт в UITableView. Искам да направя това асинхронно и искам да внедря кеш на бедняк за миниатюрните изображения. Ето моя кодов фрагмент (ще опиша проблемното поведение по-долу):
@property (nonatomic, strong) NSMutableDictionary *thumbnailsCache;
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
// ...after obtaining the cell:
NSString *thumbnailCacheKey = [NSString stringWithFormat:@"cache%d", indexPath.row];
if (![[self.thumbnailsCache allKeys] containsObject:thumbnailCacheKey]) {
// thumbnail for this row is not found in cache, so get it from remote website
__block NSData *image = nil;
dispatch_queue_t imageQueue = dispatch_queue_create("queueForCellImage", NULL);
dispatch_async(imageQueue, ^{
NSString *thumbnailURL = myCustomFunctionGetThumbnailURL:indexPath.row;
image = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:thumbnailURL]];
dispatch_async(dispatch_get_main_queue(), ^{
cell.imageView.image = [UIImage imageWithData:image];
});
});
dispatch_release(imageQueue);
[self.thumbnailsCache setObject:image forKey:thumbnailCacheKey];
} else {
// thumbnail is in cache
NSData *image = [self.thumbnailsCache objectForKey:thumbnailCacheKey];
dispatch_async(dispatch_get_main_queue(), ^{
cell.imageView.image = [UIImage imageWithData:image];
});
}
И така, ето проблемното поведение:
Когато UITableView се зареди, миниатюрите не се показват в първоначалния набор от клетки. Едва когато клетка се премести извън екрана и след това се премести обратно, миниатюрата се показва.
Кешът изобщо не работи. От това, което мога да кажа, не успява да запази миниатюрата в кеша. Тоест този ред е неуспешен:
[self.thumbnailsCache setObject:image forKey:thumbnailCacheKey];
GCD опашката се създава/освобождава за всяка клетка. Освен това името на опашката е едно и също всеки път. Това лоша практика ли е?
Ще се радвам да посочите всичко, което видите, че е грешно, или дори коментари за общ подход. Благодаря.
Актуализация:
РАЗРЕШЕНО: Добавих извикване за reloadRowsAtIndexPaths и сега миниатюрните изображения се зареждат в началните редове, които показват
РАЗРЕШЕНО: Причината да се провали е, че добавяше обекта на изображението към речника, преди другата нишка да завърши настройването на този обект. Създадох метод на екземпляр за добавяне на обект към речника на свойствата, така че да мога да го извикам от вътрешността на блока, като гарантирам, че ще бъде добавен, след като обектът на изображението е зададен.