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

本文介绍了一种iOS应用中实现UIImageView轮播图加载网络图片的方法,通过自定义类PP_LoadImageManagar来管理图片的下载、缓存及加载过程,确保应用流畅运行的同时减少网络请求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

1523603-a9932a70fbbbb323.gif
无限轮播_网路图片加本地.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;```
### PyCharm 打开文件显示全的解决方案 当遇到PyCharm打开文件显示全的情况时,可以尝试以下几种方法来解决问题。 #### 方法一:清理缓存并重启IDE 有时IDE内部缓存可能导致文件加载异常。通过清除缓存再启动程序能够有效改善此状况。具体操作路径为`File -> Invalidate Caches / Restart...`,之后按照提示完成相应动作即可[^1]。 #### 方法二:调整编辑器字体设置 如果是因为字体原因造成的内容显示问题,则可以通过修改编辑区内的文字样式来进行修复。进入`Settings/Preferences | Editor | Font`选项卡内更改合适的字号大小以及启用抗锯齿功能等参数配置[^2]。 #### 方法三:检查项目结构配置 对于某些特定场景下的源码视图缺失现象,可能是由于当前工作空间未能正确识别全部模块所引起。此时应该核查Project Structure的Content Roots设定项是否涵盖了整个工程根目录;必要时可手动添加遗漏部分,并保存变更生效[^3]。 ```python # 示例代码用于展示如何获取当前项目的根路径,在实际应用中可根据需求调用该函数辅助排查问题 import os def get_project_root(): current_file = os.path.abspath(__file__) project_dir = os.path.dirname(current_file) while not os.path.exists(os.path.join(project_dir, '.idea')): parent_dir = os.path.dirname(project_dir) if parent_dir == project_dir: break project_dir = parent_dir return project_dir print(f"Current Project Root Directory is {get_project_root()}") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值