2013-01-01 68 views
-1

我在我的iOS應用程序中實現了一個緩存,這將保持圖像下載到RAM中。緩存動態內存中保存圖像iphone

我做了一些研究,發現了一些代碼,但其中大部分是用於將圖像緩存到永久存儲。我試過NSCache,但無法滿足我的需求。

的要求是:在保存圖像

  • 限制。例如100.
  • 當達到緩存限制時,它應該刪除插入的大多數舊圖像,然後再添加一個新圖像。

我不確定確切的單詞,但我認爲它應該被稱爲FIFO緩存(先進先出)。

經過一番研究,我做了以下實現。

static NSMutableDictionary *thumbnailImagesCache = nil; 

+ (UIImage *)imageWithURL:(NSString *)_imageURL 
{ 
    if (thumbnailImagesCache == nil) { 
     thumbnailImagesCache = [NSMutableDictionary dictionary]; 
    } 

    UIImage *image = nil; 

    if ((image = [thumbnailImagesCache objectForKey:_imageURL])) { 
     DLog(@"image found in Cache") 
     return image; 
    } 

    /* the image was not found in cache - object sending request for image is responsible to download image and save it to cache */ 
    DLog(@"image not found in cache") 
    return nil; 
} 

+ (void)saveImageForURL:(UIImage *)_image URLString:(NSString *)_urlString 
{ 
    if (thumbnailImagesCache == nil) { 
     thumbnailImagesCache = [NSMutableDictionary dictionary]; 
    } 

    if (_image && _urlString) { 
     DLog(@"adding image to cache") 

     if (thumbnailImagesCache.count > 100) { 
      NSArray *keys = [thumbnailImagesCache allKeys]; 
      NSString *key0 = [keys objectAtIndex:0]; 
      [thumbnailImagesCache removeObjectForKey:key0]; 
     } 

     [thumbnailImagesCache setObject:_image forKey:_urlString]; 
     DLog(@"images count in cache = %d", thumbnailImagesCache.count) 
    } 
} 

現在的問題是,我不知道天氣這是正確的/有效的解決方案。任何人有更好的主意/解決方案?

回答

2

你對關鍵的順序的假設肯定是不正確的。 NSDictionary中的鍵的順序未指定,索引0處的鍵和值不必是最老的一個。您應該將每個圖像的創建日期存儲在將它們放入緩存字典的方法中。

除此之外,其餘的代碼似乎有效。

+0

這正是我心中所懷疑的。我看到圖片在列表中的隨機位置再次下載。我不確定。現在考慮爲所有圖像對象添加創建日期,但似乎並不容易:\。謝謝! –

+0

@AbdullahUmer這真的很簡單。不要直接將圖像添加到字典中,而要添加另一個字典,其中帶有「圖像」和「日期」鍵。然後你可以搜索創建日期。 – 2013-01-01 12:17:25

+0

這給了我另一個想法。而不是創建日期和保存字典。爲什麼不把鍵添加到arrayOfKeys。當達到極限時,我得到索引0處的密鑰,並從緩存中除去圖像以及數組中的密鑰。你怎麼看? @ H2CO3 –