iOS-封装轮播图Demo补充--简单实现封装网络请求图片缓存本地

直道相思了无益,未妨惆怅是清狂!<伊布>

GitHub,星星啥的不需要了,对你有点启发就好
把前两天写的两个 UIImageView 的无限轮播完善一下,主要是简单实现轮播图加载网络照片!其他的点击图片响应等慢慢实现,小伙伴们不要放弃加油,继续寻找幸福吧!
两个 UIImageView 无限轮播图参考思路

无限轮播_网路图片加本地.gif
思路分析:
  • 在原有的基础之上,初始化轮播图视图的方法中增加一个参数,告诉它传入的照片名数组是本地照片,还是网络照片!
  • 在需要照片的地方判断传入的参数是否为网络照片,是的话就去获取(第一次),获取的照片缓存起来,下次使用的时候直接去缓存中获取。
  • 创建一个获取网络照片的管理类,只需要传入照片的网络地址,就可以请求成功缓存起来。
  • 发起网络请求之前先根据网址进行判断本地是否已经缓存了该图片。
  • 缓存中有的话从缓存取出,没有则利用 Session 请求获取该图片并缓存到本地。
  • 注意的是我们根据网址去判断,那么我们存储到沙盒缓存的文件名称要和网址字符串一一对应。
  • 这里不能直接用网址作为文件名称,所以我考虑把网址字符串用 MD5 转化后作为文件名称存储在缓存中。

上代码:

  • 我们新建的获取图片的类:
    PP_LoadImageManagar.h

  • 声明一个代理协议,获取照片时候回调给需要的类

@protocol PP_LoadImageManagarDelegate <NSObject>
//当获取到UIImage数据的时候,代理对象执行这个方法
- (void)imageDownloader:(PP_LoadImageManagar *)downloader didFinishedLoading:(UIImage *)image;
@end```
```code
定义一个回调照片的 Block类型 在不使用代理的时候使用它回调
typedef void(^PP_RturnBlock)(UIImage *returnImage);
  • 其它给外界的借口
// 单例创建
 + (instancetype)shareImageDownManagar;
/**
 获取照片
 @param imageUrlStr 照片的网址
 @param dele        执行的代理 (可以为空,执行 Block 即可)
 @param returnImage  Block 回调传回需要的照片
 */
 - (void)getImageUrlString:(NSString *)imageUrlStr delegate:(id<PP_LoadImageManagarDelegate>)dele successfulBlock:(PP_RturnBlock)returnImage;
 // 清除缓存
 - (void)clearLoopImageViewCaches;```
------
PP_LoadImageManagar.m中
- 创建缓存的文件夹,返回他的路径
```code
// 创建缓存文件夹
 - (NSString *)getLocationImageDataFilePath{
    
    // 获取 Document 路径
    NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    
    // 拼接一个缓存的文件夹路径
    path = [path stringByAppendingPathComponent:@"PP_LoopViewCache"];
    
    NSFileManager *mgr = [NSFileManager defaultManager];
    
    // 是否存在文件 没有就创建
    if(![mgr fileExistsAtPath:path]){
        [mgr createDirectoryAtPath:path withIntermediateDirectories:YES attributes:nil error:nil];
    }
    return path;
}
  • MD5转换
// 把字符串转化成 MD5字符串 去掉特殊的标记
 - (NSString *)getMD5String:(NSString *)string
{
 // 转成 C 语言的字符串
    const char *mdData = [string UTF8String];
    unsigned char result[CC_MD5_DIGEST_LENGTH];
    CC_MD5(mdData, (CC_LONG)strlen(mdData), result);
    
 // 化成 OC 不可变 字符串
    NSMutableString *mdString  = [NSMutableString new];
    for (int i =0 ; i < CC_MD5_DIGEST_LENGTH; i++)
    {
        [mdString appendFormat:@"%02X",result[i]];
    }
    return mdString;
}```

- 把 NSData 对象缓存本地 指定的文件夹中
```code
  - (void)writToCacheWithData:(NSData *)data subPath:(NSString *)subPath
{
    // 直接写入本地
    subPath = [self getMD5String:subPath];
    [data writeToFile:[[self getLocationImageDataFilePath] stringByAppendingPathComponent:subPath] atomically:YES];
}```
- 从缓存中取出照片根据字符串网址
```code
 - (UIImage *)getImageFromSubPath:(NSString *)subPath
{
    subPath = [self getMD5String:subPath];
    NSData *data = [NSData dataWithContentsOfFile:[[self getLocationImageDataFilePath] stringByAppendingPathComponent:subPath]];
    return [UIImage imageWithData:data];
}```
-  清除缓存的照片
```code
 - (void)clearLoopImageViewCaches
{
    NSFileManager *managar = [NSFileManager defaultManager];
    [managar removeItemAtPath:[self getLocationImageDataFilePath] error:nil];
}```
- 关键的步骤
```code
// 获取照片  缓存有的话就从  缓存中去取到  否则网络请求
 - (void)getImageUrlString:(NSString *)imageUrlStr delegate:(id<PP_LoadImageManagarDelegate>)dele successfulBlock:(PP_RturnBlock)returnImage
{
      UIImage *image = [self getImageFromSubPath:imageUrlStr];
        if (image)
        {
            // 6.代理执行协议中的方法,将图片作为参数传过去
            dispatch_async(dispatch_get_main_queue(), ^{
                
                dele != nil ? [dele imageDownloader:self didFinishedLoading:image] : nil;
            // 6.用Block回调传递数据
                returnImage != nil ? returnImage(image) : nil ;
            });
        }else
        {
            __weak  typeof(PP_LoadImageManagar) * downloader = self;
            //1.准备url对象
            NSURL * url = [NSURL URLWithString:imageUrlStr];
            //2.创建request请求对象
            NSURLRequest * request = [NSURLRequest requestWithURL:url];
            //3.创建会话
            NSURLSession *session = [NSURLSession sharedSession];
            //4.创建请求任务
            NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
                // 获取数据写入本地
                UIImage *image = nil;
                if (!data)
                {
                    image = [UIImage imageNamed:@"LoopImg.bundle/占位"];
                    
                }else
                {
                //5.将图片传值
                image = [UIImage imageWithData:data];
                [self writToCacheWithData:UIImageJPEGRepresentation(image, 1) subPath:imageUrlStr];
                }
                //6.代理执行协议中的方法,将图片作为参数传过去
                dispatch_async(dispatch_get_main_queue(), ^{
                    
                    dele != nil ? [dele imageDownloader:downloader didFinishedLoading:image] : nil;
                    // 6.用Block回调传递数据
                    returnImage != nil ? returnImage(image) : nil ;
                });
            }];
            //执行任务
            [task resume];
        }
}

Ps: 这是简单获取网址照片的方法简单实现,只需要在初始化轮播图的时候把需要展示的网址数组传入,同时传入一个参数让轮播图类明白这是网址照片。 最后在展示照片的地方判断是否需要调用我们创建的获取网络图片的类的方法后去图片。

/**
 创建方法
 @param imageArray 存放照片名称的数组
 @param frame      位置
 @param fromNetWork
 */
 - (instancetype)initWithImageArray:(NSArray <NSString *>*)imageArray
                              fram:(CGRect)frame
                       fromNetWork:(BOOL)fromNetwork;
/**
 更改图片数据的方法
 @param newArray    新的数据数组  存储的是照片的信息
 @param fromNetWork 是否是网络照片
 */
 - (void)changeImageArray:(NSArray *)newArray fromNetWork:(BOOL)fromNetWork;```
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容