ios內存優化的輪播圖

作爲開發者,我們都想讓我們的代碼優化,同時讓應用的內存最優化,使得應用的界面更加流暢。現在網上關於圖片輪播的框架層出不窮,千奇百怪,最近我根據自己的思路,用兩個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
今天就和大家聊到這,如果你有更好的意見或者想進行問題討論,都歡迎您的留言,我們一起成長!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章