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
今天就和大家聊到这,如果你有更好的意见或者想进行问题讨论,都欢迎您的留言,我们一起成长!!!

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