2013-02-18 4 views
2

У меня есть следующий код:Как кэшировать изображения для просмотра таблицы?

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ 
//P1 
UITableViewCell *cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell Identifier"] autorelease]; 
cell.textLabel.text = [photoNames objectAtIndex:indexPath.row]; 

//Check if object for key exists, load from cache, otherwise, load 

    id cachedObject = [_cache objectForKey:[photoURLs objectAtIndex:indexPath.row]]; 

    if (cachedObject == nil) { 
     //IF OBJECT IS NIL, SET IT TO PLACEHOLDERS 
     cell.imageView.image = cachedObject; 
     [self setImage:[UIImage imageNamed:@"loading.png"] forKey:[photoURLs objectAtIndex:indexPath.row]]; 
     [cell setNeedsLayout]; 

    } else { 
     //fetch imageData 
     dispatch_async(kfetchQueue, ^{ 
      //P1 
      NSData *imageData = [NSData dataWithContentsOfURL:[photoURLs objectAtIndex:indexPath.row]]; 
       dispatch_async(dispatch_get_main_queue(), ^{ 
        cell.imageView.image = [UIImage imageWithData:imageData]; 
        [self setImage:cell.imageView.image forKey:cell.textLabel.text]; 
        [cell setNeedsLayout]; 
       }); 
     }); 
    } 
return cell; 

}

Кроме этого, метод viewDidLoad извлекает из Интернета, в результате JSon из фликра, чтобы заполнить photoNames и photoURLs. Я пытаюсь кэшировать уже загруженные изображения в локальный NSDictionary. Проблема в том, что изображения arent загружены. Даже образ местазагрузки loading.png.

ответ

3

Вы хотите сохранить его в каталог документов приложения:

NSData *imageData = UIImagePNGRepresentation(newImage); 

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 

NSString *imagePath =[documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.png",@"cached"]]; 

NSLog((@"pre writing to file")); 
if (![imageData writeToFile:imagePath atomically:NO]) 
{ 
    NSLog((@"Failed to cache image data to disk")); 
} 
else 
{ 
    NSLog((@"the cachedImagedPath is %@",imagePath)); 
} 

Тогда просто сохранить путь в вашей NSMutableDictionary с:

[yourMutableDictionary setObject:theIMagePath forKey:@"CachedImagePath"]; 

Затем извлечь его с чем-то вроде:

NSString *theImagePath = [yourMutableDictionary objectForKey:@"cachedImagePath"]; 
UIImage *customImage = [UIImage imageWithContentsOfFile:theImagePath]; 

Я рекомендую сохранять словарь в NSUserDefaults.

+0

Я не хочу записывать его на диск, потому что я не хочу, чтобы он был доступен при следующем запуске. Каждый раз, когда пользователь запускает приложение, он может захотеть найти другое изображение. Мне нужно сохранить его только в локальной памяти. – marciokoko

+0

Затем просто очистите кеш-путь при вызове applicationDidEnterBackground. –

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