作爲開發者,我們都想讓我們的代碼優化,同時讓應用的內存最優化,使得應用的界面更加流暢。現在網上關於圖片輪播的框架層出不窮,千奇百怪,最近我根據自己的思路,用兩個imageView也實現了圖片輪播,這裏說說我的主要思路以及大概步驟。
首先說一下好處:文件少,代碼簡潔。2.不依賴於其他第三方庫,耦合行低。3.自帶圖片緩存,一次加載,永久使用。4.性能好,佔用內存少。輪播流暢
實際應用
`實際開發中,我們很少會輪播本地圖片,大部分都是服務器獲取的,也有可能既有本地圖片,也有網絡圖片,那要如何來加載呢?
定義4個屬性
NSArray imageArray:暴露在.h文件中,外界將要加載的圖片或路徑數組賦值給該屬性
NSMutableArray images:用來存放圖片的數組
NSMutableDictionary imageDic:用來緩存圖片的字典,key爲URL
NSMutableDictionary operationDic:用來保存下載操作的字典,key爲URL
判斷外界傳入的是圖片還是路徑,如果是圖片,直接加入圖片數組中,如果是路徑,先添加一個佔位圖片,然後根據路徑去下載圖片
在這裏我封裝了一個從網絡下載的的方法,在我們一般開發時,我們一般都是進行網絡數據解析,所以一般的都是直接使用數組。
- (void)setImageArray:(NSArray *)imageArray{
if (!imageArray.count) return;
self.promptLabel.hidden = YES;
_imageArray = imageArray;
_images = [NSMutableArray array];
for (int i = 0; i < imageArray.count; i++) {
if ([imageArray[i] isKindOfClass:[UIImage class]]) {
[_images addObject:imageArray[i]];
} else if ([imageArray[i] isKindOfClass:[NSString class]]){
[_images addObject:[UIImage imageNamed:@"placeholder"]];
[self downloadImages:i];
}
}
下載圖片,先從緩存中取,如果有,則替換之前的佔位圖片,如果沒有,去沙盒中取,如果有,替換佔位圖片,並添加到緩存中,如果沒有,開啓異步線程下載
#pragma mark 下載網絡圖片
- (void)downloadImages:(int)index {
NSString *key = _imageArray[index];
//從內存緩存中取圖片
UIImage *image = [self.imageDic objectForKey:key];
if (image) {
_images[index] = image;
}else{
//從沙盒緩存中取圖片
NSString *cache = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"XRCarousel"];
NSString *path = [cache stringByAppendingPathComponent:[key lastPathComponent]];
NSData *data = [NSData dataWithContentsOfFile:path];
if (data) {
image = [UIImage imageWithData:data];
_images[index] = image;
[self.imageDic setObject:image forKey:key];
}else{
//下載圖片
NSBlockOperation *download = [self.operationDic objectForKey:key];
if (!download) {
//創建一個操作
download = [NSBlockOperation blockOperationWithBlock:^{
NSURL *url = [NSURL URLWithString:key];
NSData *data = [NSData dataWithContentsOfURL:url];
if (data) {
UIImage *image = [UIImage imageWithData:data];
[self.imageDic setObject:image forKey:key];
self.images[index] = image;
//如果只有一張圖片,需要在主線程主動去修改currImageView的值
if (_images.count == 1) [_currImageView performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:NO];
[data writeToFile:path atomically:YES];
[self.operationDic removeObjectForKey:key];
}
}];
[self.queue addOperation:download];
[self.operationDic setObject:download forKey:key];
}
}
}
}
詳細代碼及demo參考:https://github.com/hw2396611405/lunbotu
今天就和大家聊到這,如果你有更好的意見或者想進行問題討論,都歡迎您的留言,我們一起成長!!!