我的應用程序是一種圖片庫。當用戶點擊圖庫中的圖標時,需要顯示圖像(橫向2圖像,縱向1圖像)。圖片可能超過100張。我通常採用原始文件並將其解碼爲UIImage格式。如果用戶想要看到另一個圖像,則需要一些時間(延遲)來顯示圖像,因爲它們是解碼的。所以我想要保存一些圖像到緩存(NSArray)在一個單獨的線程(GCD)來解決這個問題。需要使用緩衝區保存和檢索UIImages
在數組中,我可能會存儲5到10個圖像。每次用戶滑動時都需要更新。
請給出建議。
在此先感謝。
我的應用程序是一種圖片庫。當用戶點擊圖庫中的圖標時,需要顯示圖像(橫向2圖像,縱向1圖像)。圖片可能超過100張。我通常採用原始文件並將其解碼爲UIImage格式。如果用戶想要看到另一個圖像,則需要一些時間(延遲)來顯示圖像,因爲它們是解碼的。所以我想要保存一些圖像到緩存(NSArray)在一個單獨的線程(GCD)來解決這個問題。需要使用緩衝區保存和檢索UIImages
在數組中,我可能會存儲5到10個圖像。每次用戶滑動時都需要更新。
請給出建議。
在此先感謝。
嘗試這一個 -
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];
}
感謝您的答覆兄弟。 1)延遲不是下載而是解碼(其他格式爲UIImage格式)。 2)對於imageCache哪一個是好的(NSArray或NSMutable Array或任何其他) –
您可以使用Apple的LazyTableImages。
此代碼將在後臺下載圖像,並在下載完成時設置爲imageview。您可以添加佔位符圖像,直到您的原始圖像正在下載過程中。
我在很多應用程序中使用了這個示例,所以如果您需要,我也可以幫助您實施。
希望這會幫助你。
感謝您的保證兄弟。它適用於高分辨率圖像嗎? –
我一直在使用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"];
}
您應該使用NSCache用於內存緩存,或查看解決方案ns也有磁盤緩存。有很多圖像的緩存實現。 – Andy
謝謝安迪。我也會這樣做。如果可能,請提供一些鏈接以供參考。 –
@安迪再次感謝。按照您的建議實施NSCache。它工作正常。 –