2014-09-21 5 views
1

У меня есть NSCache, в котором я загружаю и-изображения, которые будут отображаться в виде коллекции. Когда мне нужно перезагрузить данные в виде коллекции, я должен очистить кеш, поскольку в противном случае представление коллекции найдет старые данные и перезагрузит их вместо новых данных.NSCache - не всегда очищается?

Поэтому, прежде чем я перезагружать коллекцию я чищу кеш:

[self.myCache removeAllObjects]; 

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

Вот как я загружать и получать изображения от и до:

-(UIImage*) imageForIndexPathRow:(NSNumber *) number 
{ 
    return [self.myCache objectForKey:[NSString stringWithFormat:@"cache:%d",[number intValue]] ]; 
} 

-(void) setImage:(UIImage*) image forIndexPathRow:(NSNumber *) number 
{ 
    if(image) 
     [self.myCache setObject:image forKey:[NSString stringWithFormat:@"cache:%d",[number intValue]] ]; 
} 

EDIT: Это, как я проверить кэш, прежде чем загрузить изображение в ячейку (в другом потоке):

UIImage *imageToSet=nil; 
         UIImage *cacheImg=[self imageForIndexPathRow:[NSNumber numberWithLong:cell.tag]]; 
         if(cacheImg==nil) 
         { 
          UIImage *image=[UIImage imageWithData:data scale:1]; 
          imageToSet=image; 
          //save to cache 
          [self setImage:image forIndexPathRow:[NSNumber numberWithLong:cell.tag]]; 

         } 
         else 
         imageToSet=cacheImg; 
+0

вы уверены, что это не проблема с повторным использованием клеток? Я вижу метод, основанный на методе indexpath, поэтому я подозреваю, что вы используете tableview –

+0

Я использую представление коллекции, как я писал в вопросе, но я не думаю, что это так, потому что, когда создается новая ячейка, я загружаю новое изображение в его образ изображения и очистить старый. есть ли что-то, что вы думаете, я могу сделать/проверить, чтобы знать наверняка? – Curnelious

+0

Откуда берутся изображения? Паутина? Кеширование загрузки URL-адресов? – Wain

ответ

1

Проблема возникает из-за повторного использования ячейки CellView

необходимо установить корпус else, например

- (UIImage *)imageForIndexPathRow:(NSNumber *) number 
{ 
    UIImage *cachedImage = [self.myCache objectForKey:[NSString stringWithFormat:@"cache:%d", [number intValue]]]; 
    if (cachedImage) { 
     return cachedImage; 
    } 
    // Otherwise load it from web 
    NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://...yourImageURL"]]; 
    UIImage *loadedImage = [UIImage imageWithData:imageData]; 

    // Cache it back 
    [self.myCache setObject:loadedImage forKey:[NSString stringWithFormat:@"cache:%d", [number intValue]]]; 
    return loadedImage; 
} 

и cellForRow должен выглядеть следующим образом (мой пример на UITableView, но вы можете его порт CollectionView)

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:@"YourCellId"]; 
    cell.image = nil; 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ 
     UIImage *image = [self imageForIndexPathRow:@(indexPath.row)]; 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      cell.image = image; 
     }); 
    }); 
    return cell; 
} 
+0

большое спасибо, но это то, что я делаю, проверяю мое редактирование. – Curnelious

+0

hmm .. установить точку останова на if (cacheImg == nil) и посмотреть, что произойдет после [self.myCache removeAllObjects] ;, он попадает в блок else? – l0gg3r

+0

ОК, я думаю, я понял, может быть, вы можете помочь. Когда это происходит, когда я перезагружаю коллекцию, но за 1 минута до нее, я прокручиваю до начала коллекции - анимация WTA установлена ​​в YES (scrollToVisibile). происходит то, что иногда, когда он заканчивает автоматическую прокрутку, он начинает загружать в фоновом режиме старые изображения, а не новые. Я думаю, что мне нужно установить bolean для выхода из cellForItemAtIndexPath: метод при автоматической прокрутке? – Curnelious

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