zoukankan      html  css  js  c++  java
  • SDWebImageInfo

    SDWebImage

    简介

    • iOS中著名的牛逼的网络图片处理框架
    • 包含的功能:图片下载、图片缓存、下载进度监听、gif处理等等
    • 用法极其简单,功能十分强大,大大提高了网络图片的处理效率
    • 国内超过90%的iOS项目都有它的影子
    • 框架地址:https://github.com/rs/SDWebImage

    获得框架

    • 进入终端
    • 输入以下命令
    git clone --recursive https://github.com/rs/SDWebImage.git

    第三方框架

    介绍

    • 由网络大牛来编写的框架程序
    • 针对某一个具体的技术问题,提供完善的解决方案

    特点

    • 功能强大
    • 有非常好的错误处理
    • 持续升级维护

    选择依据

    • 看懂源程序
      • 如果有时间,要尽量阅读常用框架的源程序并记录笔记
    • 看人数
    • 看口碑
      • 如果大家都说好,那就大胆的用

    使用

    • 工作后,往死里用
    • 学习中,尽量看懂源程序
    • 获取框架
    • 导入框架
      • 直接拖拽
        • 编译,由于绝大多数第三方框架会有对其他框架的依赖,先编译确认能够正常使用
      • cocoapod
        • 第三方框架管理工具
        • 终端操作
        • 后面会讲

    如何学习第三方框架

    • 看官方文档
    • 运行示例程序,找线索
    • 利用 git 分支添加注释
    • 编写测试代码,整理学习笔记
    • 阅读源程序(如果是用 C 语言编写的框架源程序不要看
    • 不要依赖谷歌/百度
      • 因为第三方框架通常更新的很快,而网络文章要慢很多
      • 有可能搜索到的一篇文章是很早以前版本的使用文档

    学习第三方框架的好处

    • 了解底层实现原理
    • 发现自己的知识空缺点
    • 学习新的实用技术

    位移枚举

    • 位移枚举是非常古老的 C 语言技巧
    • 按位与 如果都是 1 结果就是1
    • 按位或 如果都是 0 结果就是0

    演练

    • 定义枚举类型
    /// 操作类型枚举
    typedef enum {
        ActionTypeTop       = 1 << 0,
        ActionTypeBottom    = 1 << 1,
        ActionTypeLeft      = 1 << 2,
        ActionTypeRight     = 1 << 3
    } ActionType;
    • 方法目标

      • 根据操作类型参数,做出不同的响应
      • 操作类型可以任意组合
    • 方法实现

    - (void)action:(ActionType)type {
    
        if (type == 0) {
            NSLog(@"无操作");
            return;
        }
    
        if (type & ActionTypeTop) {
            NSLog(@"Top %tu", type & ActionTypeTop);
        }
        if (type & ActionTypeBottom) {
            NSLog(@"Bottom %tu", type & ActionTypeBottom);
        }
        if (type & ActionTypeLeft) {
            NSLog(@"Left %tu", type & ActionTypeLeft);
        }
        if (type & ActionTypeRight) {
            NSLog(@"Right %tu", type & ActionTypeRight);
        }
    }
    • 方法调用
    ActionType type = ActionTypeTop | ActionTypeRight;
    [self action:type];

    代码小结

    • 使用 按位或 可以给一个参数同时设置多个 类型
    • 在具体执行时,使用 按位与 可以判断具体的 类型
    • 通过位移设置,就能够得到非常多的组合!
    • 对于位移枚举类型,如果传入 0,表示什么附加操作都不做,通常执行效率是最高的
    • 如果开发中,看到位移的枚举,同时不要做任何的附加操作,参数可以直接输入 0!

    iOS 特有语法

    • iOS 5.0之后,提供了新的枚举定义方式
    • 定义枚举的同时,指定枚举中数据的类型
    • typedef NS_OPTIONS(NSUInteger, NSJSONReadingOptions)
      • 位移枚举,可以使用 按位或 设置数值
    • typedef NS_ENUM(NSInteger, UITableViewStyle)
      • 数字枚举,直接使用枚举设置数值
    typedef NS_OPTIONS(NSUInteger, ActionType) {
        ActionTypeTop       = 1 << 0,
        ActionTypeBottom    = 1 << 1,
        ActionTypeLeft      = 1 << 2,
        ActionTypeRight     = 1 << 3
    };

    NSCache

    介绍

    • NSCache 是苹果提供的一个专门用来做缓存的类
    • 使用和 NSMutableDictionary 非常相似
    • 是线程安全的
    • 当内存不足的时候,会自动清理缓存
    • 程序开始时,可以指定缓存的数量 & 成本

    方法

    • 取值

      • - (id)objectForKey:(id)key;
    • 设置对象,0成本

      • - (void)setObject:(id)obj forKey:(id)key;
    • 设置对象并指定成本

      • - (void)setObject:(id)obj forKey:(id)key cost:(NSUInteger)g;
    • 成本示例,以图片为例:

      • 方案一:缓存 100 张图片
      • 方案二:总缓存成本设定为 10M,以图片的 宽 * 高当作成本,图像像素。这样,无论缓存的多少张照片,只要像素值超过 10M,就会自动清理
      • 结论:在缓存图像时,使用成本,比单纯设置数量要科学!
    • 删除

      • - (void)removeObjectForKey:(id)key;
    • 删除全部(不要使用!)

      • - (void)removeAllObjects;

    属性

    • @property NSUInteger totalCostLimit;

      • 缓存总成本
    • @property NSUInteger countLimit;

      • 缓存总数量
    • @property BOOL evictsObjectsWithDiscardedContent;

      • 是否自动清理缓存,默认是 YES

    代码演练

    • 定义缓存属性
    @property (nonatomic, strong) NSCache *cache;
    • 懒加载并设置限制
    - (NSCache *)cache {
        if (_cache == nil) {
            _cache = [[NSCache alloc] init];
            _cache.delegate = self;
            _cache.countLimit = 10;
        }
        return _cache;
    }
    • 触摸事件添加缓存
    - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
        for (int i = 0; i < 20; ++i) {
            NSString *str = [NSString stringWithFormat:@"%d", i];
            NSLog(@"set -> %@", str);
            [self.cache setObject:str forKey:@(i)];
            NSLog(@"set -> %@ over", str);
        }
    
        // 遍历缓存
        NSLog(@"------");
    
        for (int i = 0; i < 20; ++i) {
            NSLog(@"%@", [self.cache objectForKey:@(i)]);
        }
    }
    
    // 代理方法,仅供观察使用,开发时不建议重写此方法
    - (void)cache:(NSCache *)cache willEvictObject:(id)obj {
        NSLog(@"remove -> %@", obj);
    }

    修改网络图片框架

    • 修改图像缓冲池类型,并移动到 .h 中,以便后续测试
    ///  图像缓冲池
    @property (nonatomic, strong) NSCache *imageCache;
    • 修改懒加载,并设置数量限制
    - (NSCache *)imageCache {
        if (_imageCache == nil) {
            _imageCache = [[NSCache alloc] init];
            _imageCache.countLimit = 15;
        }
        return _imageCache;
    }
    • 修改其他几处代码,将 self.imageCache[URLString] 替换为 [self.imageCache setObject:image forKey:URLString];

    • 测试缓存中的图片变化

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
        for (AppInfo *app in self.appList) {
            NSLog(@"%@ %@", [[DownloadImageManager sharedManager].imageCache objectForKey:app.icon], app.name);
        }
    }
    • 注册通知,监听内存警告
    - (instancetype)init
    {
        self = [super init];
        if (self) {
            // 注册通知
            [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(clearMemory) name:UIApplicationDidReceiveMemoryWarningNotification object:nil];
        }
        return self;
    }
    
    // 提示:虽然执行不到,但是写了也无所谓
    - (void)dealloc {
        // 删除通知
        [[NSNotificationCenter defaultCenter] removeObserver:self];
    }
    • 清理内存
    - (void)clearMemory {
        NSLog(@"%s", __FUNCTION__);
    
        // 取消所有下载操作
        [self.downloadQueue cancelAllOperations];
    
        // 删除缓冲池
        [self.operationChache removeAllObjects];
    }

    注意:内存警告或者超出限制后,缓存中的任何对象,都有可能被清理。使用 NSCache 做缓存一定要保证能够有恢复的通道!

  • 相关阅读:
    el-upload文件上传组件
    vue 自定义指令input表单的数据验证
    vue-resourse简单使用方法
    go语言基本运算符
    第4课
    第3课
    第2课
    第1课
    第0课
    第0课
  • 原文地址:https://www.cnblogs.com/jiahao89/p/5118269.html
Copyright © 2011-2022 走看看