获得徽章 24
掘金技术团队
齐舞647
VIP.5 如鱼得水
关注了
工程师 @字节跳动
@萌宠头像生成 生成几张可爱的小猫咪图片
7
@图片生成 生成两张云南风景画
1
成就:掘金累积签到666天
齐舞647于2024-04-04 09:58发布的图片
2
齐舞647
VIP.5 如鱼得水
关注了
工程师 @字节跳动
赞了这篇沸点
多线程中的栅栏 barrier 是什么?

先说点背景知识,iOS 开发中经常会用队列来调度 block 的执行,并发队列支持多个 block 同时执行(只要开多几个线程),串行队列让 block 只能一个一个执行,一个 block 执行完,另一个 block 才能开始。

栅栏函数就是用在并发队列中的,为的就是在并发队列中拿一点先后顺序。因为栅栏函数分配的 block A,会等这个队列中其他 block 执行完,然后到 blockA 单独执行,它执行完,然后才是队列其他中排在它后面的 block 执行。
这就相当于在无序的并发队列中拿到了一点「顺序」。

这么做的原因就是最大程度利用系统性能,顺序不敏感的 block 直接放进去,开多几个线程一起执行,对顺序有要求的 block 我就用栅栏函数放进去

图为 AFNetworking 图片下载器中添加图片缓存的逻辑,就用到了 barrier 来保证「添加图片」和「删除图片」的先后顺序[呲牙]

#每天一个知识点#
展开
跳入西湖于2024-03-22 10:46发布的图片
评论
赞了这篇沸点
SDWebimage 如何设计缓存?

memory + disk 内存+磁盘双缓存。
获取图片前先查找这两个缓存里有没有,内存里没有就去磁盘找,磁盘里没有才下载,如果磁盘里有,那么就会把磁盘缓存 copy 到内存缓存 _syncDiskToMemoryWithImage

什么时候添加缓存?
图片下载后,根据缓存策略(默认是都存)
把 UIImage 存到NSCache 中
同时也会把压缩格式的 图片存到本地沙盒

什么时候清理缓存?
内存:收到内存预警时,删除所有内存
磁盘:App 退出或者进入后台时,会检查当前缓存是否超出了maxDiskSize (默认无限额,需要开发者手动设置),或者存储的缓存数据是否过期(保质期默认 7 天 kDefaultCacheMaxDiskAge)。如果超出了,那也不是删除全部,而是把图片删除到 maxDiskSize 的一半

很合理,收工的时候清理一下,还手机一个干净整洁的空间
(真的很舒服啊 SDWebimage 的源码看着,虽然看不太懂,但是整洁、齐全、有注释,结构合理)


#每天一个知识点#
展开
评论
赞了这篇沸点
同步和异步的区别是什么?
异步基于 JS 是单线程语言,只能同时做一件事
JS 和 DOM 渲染共用同一个线程,因为 JS 可以修改 DOM 结构
异步不会阻塞代码执行
同步会阻塞代码执行
1
赞了这篇沸点
@隔壁老王 我是男的,也想过三八妇女节怎么办?
28
赞了这篇沸点
@掘金 “今天下雨,我骑车差点摔倒, 好在我一把把把把住了” 这句话里的“把”要怎么理解呢?
36
下一页
个人成就
2022年度人气作者No.32
优秀创作者
文章被点赞 944
文章被阅读 155,155
掘力值 5,233
掘金技术团队
收藏集
7
关注标签
38
加入于