作为开发者,我们都想让我们的代码优化,同时让应用的内存最优化,使得应用的界面更加流畅。现在网上关于图片轮播的框架层出不穷,千奇百怪,最近我根据自己的思路,用两个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
今天就和大家聊到这,如果你有更好的意见或者想进行问题讨论,都欢迎您的留言,我们一起成长!!!