操作缓冲池

操作缓冲池

缓冲池的选择

所谓缓冲池,其实就是一个容器,能够存放多个对象

  • 数组:按照下标,可以通过 indexPath 可以判断操作是否已经在进行中

    • 无法解决上拉&下拉刷新
  • NSSet -> 无序的
    • 无法定位到缓存的操作
  • 字典:按照key,可以通过下载图像的 URL(唯一定位网络资源的字符串)

小结:选择字典作为操作缓冲池

缓冲池属性

///  操作缓冲池
@property (nonatomic, strong) NSMutableDictionary *operationCache;
  • 懒加载
- (NSMutableDictionary *)operationCache {
    if (_operationCache == nil) {
        _operationCache = [NSMutableDictionary dictionary];
    }
    return _operationCache;
}

修改代码

  • 判断下载操作是否被缓存——正在下载
// 异步加载图像
// 0. 占位图像
UIImage *placeholder = [UIImage imageNamed:@"user_default"];
cell.iconView.image = placeholder;

// 判断操作是否存在
if (self.operationCache[app.icon] != nil) {
    NSLog(@"正在玩命下载中...");
    return cell;
}
  • 将操作添加到操作缓冲池
// 2. 将操作添加到操作缓冲池
[self.operationCache setObject:downloadOp forKey:app.icon];

// 3. 将下载操作添加到队列
[self.downloadQueue addOperation:downloadOp];

修改占位图像的代码位置,观察会出现的问题

  • 下载完成后,将操作从缓冲池中删除
[self.operationCache removeObjectForKey:app.icon];

循环引用分析!

  • 弱引用 self 的编写方法:
__weak typeof(self) weakSelf = self;
  • 利用 dealloc 辅助分析
- (void)dealloc {
    NSLog(@"我去了");
}
  • 注意

    • 如果使用 self,视图控制器会在下载完成后被销毁
    • 而使用 weakSelf,视图控制器在第一时间被销毁
时间: 2024-12-15 01:34:56

操作缓冲池的相关文章

HBase1.0.0源码分析之请求处理流程分析以Put操作为例(二)

HBase1.0.0源码分析之请求处理流程分析以Put操作为例(二) 1.通过mutate(put)操作,将单个put操作添加到缓冲操作中,这些缓冲操作其实就是Put的父类的一个List的集合.如下: private List<Row> writeAsyncBuffer = new LinkedList<>(); writeAsyncBuffer.add(m); 当writeAsyncBuffer满了之后或者是人为的调用backgroundFlushCommits操作促使缓冲池中的

异步加载图片

懒加载 加载出tableView 目标:加载图片 同步加载bug bug1:下载速度慢会卡  ->将耗时操作添加到队列 bug2:重复下载耗流量 NSOperation: 将耗时操作添加到队列中 CGD:把任务添加到队列中,指定执行函数 耗时操作:NSBlockOperation *downloadOperation = [NSBlockOperation blockOpWithBlock] 队列(全局属性):NSOperationQueue *queue 将耗时操作添加到队列 self.que

构建高可用web站点(五)

数据库是web站点中重要的应用,放在第四篇是因为之前来不及总结的原因,在之前的文章我看到了无论是Mysql或者是nosql的一些缓存和分布式一些比较扩展性的功能.但是对于单个数据库来说,它的优化也是我们学习的重点.现在我就来简单说说我自己总结的一些东西. 关于Mysql:Mysql是web站点中应用很广泛的关系型数据库.这一块的东西也是有很多值得学习的东西,介绍的书籍也很多,比如<高性能Mysql><Mysql性能调优和架构设计><Mysql技术内幕:InnoDB引擎>

NSCache

NSCache:专门做缓存的类 NSCache简介:NSCache是苹果官方提供的缓存类,用法与NSMutableDictionary的用法很相似,在AFNetworking和SDWebImage中,使用它来管理缓存. NSCache在系统内存很低时,会自动释放一些对象(出自苹果官方文档,不过在模拟器中模拟内存警告时,不会做缓存的清理动作) 为了确保接收到内存警告时能够真正释放内存,最好调用一下removeAllObjects方法. NScache是线程安全的,在多线程操作中,不需要对Cache

iOS开发之网络图片缓存

问题一:如果使用同步下载,那么网速慢的时候会超级卡 问题二:图片没有frame,所以cell初始化的时候,给imageView的frame是0,异步下载完成之后不显示 解决办法:使用占位图(如果占位图比较大,自定义cell可以解决) cell重用的时候重复多次下载的问题:控制器跳过了模型,直接对view赋值 问题四:在用户快速滚动的时候,会重复添加下载操作到队列 解决办法:建立一个下载操作的缓冲池,首先检查"缓冲池"里是否有当前图片下载操作,如果有,就不在创建了,保证一个图片只对应一个

《Mysql技术内幕》札记(上)

第一章   MYSQL体系结构和存储引擎 一.数据库的概念 数据库:数据库文件类型的集合,以frm与ibd结尾等. 数据库实例:数据库后台的进程/线程 以及共享内存组成,实例操作数据库文件数据库与实例一一对应,一个实例对应一个数据库Mysql是单进程多线程,这就意味着一个实例一个进程 MYSQL架构    SQL接口组件   查询分析器组件    优化器组件    缓存                       插件式存储引擎(基于表)                           物理

网络图像加载

所谓经验,不是指能找到一条通向目标的捷径,而是在通向目标的过程中能够有效避开各种"坑".谈一谈不借助第三方框架,加载网络图像过程中遇到的各种"坑". 应用背景:通过tableView做一个app列表的展示页,其中app的图标需要从网络上获取. 开始的状态:同步加载网络图片 问题: 1. 如果网速慢,会给用户非常明显的"卡"的感觉 2. 每次显示 cell,都会重新加载图片 解决思路: 使用多线程加载 问题: 3.tableviewCell需要交互

iOS篇之缓存一

内存指的就是主板上的存储部件,是CPU直接与之沟通,并用其存储数据的部件,存放当前正在使用的(即执行中)的数据和程序,它的物理实质就是一组或多组具备数据输入输出和数据存储功能的集成电路,内存只用于暂时存放程序和数据,一旦关闭电源或发生断电,其中的程序和数据就会丢失. 1 #import "ViewController.h" 2 #import "CZApp.h" 3 @interface ViewController () 4 // plist文件数据的容器 5 @

GCD和NSOperation多线程技术

第一讲  GCD GCD会管理多线程的生命周期 GCD底层线程池,队列跟底层线程池之间的交互,底层线程池对线程进行了复用,使用效率要高 GCD跟NSThread对比 开不开线程,和执行任务的函数有关 - 同步不开 - 异步开 (异步)开几条线程,和队列有关 - 串行队列最多开一条 - 并发队列开N条,具体条数由GCD决定! 主队列: 主队列同步会死锁: 注意主队列同步也可以不死锁,具体情况具体对待 主队列异步: 不会开启线程,在主线程中执行,但是主队列中的任务需要等待主线程中任务执行完毕之后才能