2015-04-08 27 views
6

我的應用程序是一種圖片庫。當用戶點擊圖庫中的圖標時,需要顯示圖像(橫向2圖像,縱向1圖像)。圖片可能超過100張。我通常採用原始文件並將其解碼爲UIImage格式。如果用戶想要看到另一個圖像,則需要一些時間(延遲)來顯示圖像,因爲它們是解碼的。所以我想要保存一些圖像到緩存(NSArray)在一個單獨的線程(GCD)來解決這個問題。需要使用緩衝區保存和檢索UIImages

在數組中,我可能會存儲5到10個圖像。每次用戶滑動時都需要更新。

請給出建議。

在此先感謝。

+0

您應該使用NSCache用於內存緩存,或查看解決方案ns也有磁盤緩存。有很多圖像的緩存實現。 – Andy

+0

謝謝安迪。我也會這樣做。如果可能,請提供一些鏈接以供參考。 –

+0

@安迪再次感謝。按照您的建議實施NSCache。它工作正常。 –

回答

2

嘗試這一個 -

UIImage *image = [imageCache objectForKey:@"myImage"]; 
    if (!image) 
    { 
     // download image 
     dispatch_async(dispatch_get_global_queue(0, 0), ^{ 
     NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:yourURL]]; 
     if (imageData) 
     { 
     // Set image to cache 
     [imageCache setObject: [UIImage imageWithData:imageData] forKey:@"myImage"]; 
     dispatch_async(dispatch_get_main_queue(), ^{ 
     [yourImageView setImage:[UIImage imageWithData:imageData]]; 
     }); 
     } 
    }); 
} 
else 
{ 
    // Use image from cache 
    [yourImageView setImage:image]; 
} 
+0

感謝您的答覆兄弟。 1)延遲不是下載而是解碼(其他格式爲UIImage格式)。 2)對於imageCache哪一個是好的(NSArray或NSMutable Array或任何其他) –

0

您可以使用Apple的LazyTableImages

此代碼將在後臺下載圖像,並在下載完成時設置爲imageview。您可以添加佔位符圖像,直到您的原始圖像正在下載過程中。

我在很多應用程序中使用了這個示例,所以如果您需要,我也可以幫助您實施。

希望這會幫助你。

+1

感謝您的保證兄弟。它適用於高分辨率圖像嗎? –

3

我一直在使用GCD

dispatch_async(dispatch_get_global_queue(0, 0), ^{ 

    [self storeInCache]; 

     dispatch_async(dispatch_get_main_queue(), ^{ 

      UIImage *image=[_imageCache objectForKey:@"P5"]; 
      self.imageView = [[UIImageView alloc] initWithImage:image]; 
      self.imageView.frame = (CGRect){.origin=CGPointMake(0.0f, 0.0f), .size=image.size}; 
      [self.scrollView addSubview:self.imageView]; 
      self.scrollView.contentSize = image.size; 
    }); 
     }); 

//商店實現NSCache 5個圖像輸入NSCache

-(void)storeInCache 
{ 

UIImage *image = [UIImage imageNamed:@"photo1.png"]; 
[_imageCache setObject:image forKey:@"P1"]; 

UIImage *image2 = [UIImage imageNamed:@"photo2.png"]; 
[_imageCache setObject:image2 forKey:@"P2"]; 

UIImage *image3 = [UIImage imageNamed:@"photo3.png"]; 
[_imageCache setObject:image3 forKey:@"P3"]; 

UIImage *image4 = [UIImage imageNamed:@"photo4.png"]; 
[_imageCache setObject:image4 forKey:@"P4"]; 

UIImage *image5 = [UIImage imageNamed:@"photo5.png"]; 
[_imageCache setObject:image5 forKey:@"P5"]; 

}