
获得徽章 0
- 想请教下在管理层的前辈们一个问题哈:
项目紧急,但你的下属不愿意加班,你会有什么应对措施?
(我也知道网上对于「加班」两个字是深恶痛绝的,大家都是打工人,何必互相为难,但这也是我好奇的地方,作为领导,如果确实要加班(这通常是很常见的),你会用什么手段和资源来让加班这件事情顺利推行)
这里给出我看过的一个方案哈:
1. 让加班的人落着好(优先安排培训资格、优先安排假期,优先安排好的项目、跳操时优先给好推荐信、提供方便)
2. 限制加班资格(部分人因为特殊资格安排加班,部分人默认不加班,拒绝过加班的则一段时间内不再发出加班的要求)
3. 建立丰富的外包供应商体系,将不涉密的工作职能交给外包,有超常规的工作需求(也就是要加班干的活)考虑让外包来做
4. 保持正常人员流动,逐渐筛选出核心的技术骨干
5. 公开表扬时,不鼓励加班(而是按实际的项目成绩),避免诱导部分人「投机加班」
#新人报道#展开等人赞过1317 - #每天一个知识点#
当我们在谈论图片解码的时候,我们在谈什么?
我们常见的图片 PNG JPEG 文件,实际上是压缩过的,为了减少空间占用和带宽消耗嘛。
那么屏幕要显示这些图片就必须经过解压,拿到完整的位图数据(像素数组,每个元素代表图片上的一个点)。
在 iOS 开发中呢,解码分四步走:
1. 根据 NSData 对象(从文件读取生成)创建一个 source 对象,source 是待解码数据的输入,解码的过程都是通过它来完成
2. 从 source 中读取图像信息,比如图像格式、元信息等,下一步解码要用
3. 调用解码库解码 source,苹果自带的就是 ImageIO,接口是CGImageSourceCreateImageAtIndex,得到一个 CGImageRef
4. 根据解码后的数据生成 UIImage,它是可以显示的图像对象。释放资源
动态图片的解码也差不多,只是将一帧帧图片都解码生成 UIImage,后面再把所有 UIImage 合并生成一个 AnimatedImage(还是 UIImage 类型)
第三方解码器解码的过程又有所不同,就是不用 source 了,重点放在 BitMap 的获取上
1. 先获取到图像的 BitMap 数据(像素数组)
2. 根据 BitMap 生成 CGImage 数据
3. 重绘。把 CGImage 绘制到一个上下文里,这一步是因为CALayer 和 UIImageView 渲染的时候要求的色彩限定,为了减少渲染消耗和内存消耗,这里重新绘制一波
4. 然后根据上下文 context 生成 UIImage。(当然,也要清理资源)展开评论点赞 - SDWebimage 如何设计缓存?
memory + disk 内存+磁盘双缓存。
获取图片前先查找这两个缓存里有没有,内存里没有就去磁盘找,磁盘里没有才下载,如果磁盘里有,那么就会把磁盘缓存 copy 到内存缓存 _syncDiskToMemoryWithImage
什么时候添加缓存?
图片下载后,根据缓存策略(默认是都存)
把 UIImage 存到NSCache 中
同时也会把压缩格式的 图片存到本地沙盒
什么时候清理缓存?
内存:收到内存预警时,删除所有内存
磁盘:App 退出或者进入后台时,会检查当前缓存是否超出了maxDiskSize (默认无限额,需要开发者手动设置),或者存储的缓存数据是否过期(保质期默认 7 天 kDefaultCacheMaxDiskAge)。如果超出了,那也不是删除全部,而是把图片删除到 maxDiskSize 的一半
很合理,收工的时候清理一下,还手机一个干净整洁的空间
(真的很舒服啊 SDWebimage 的源码看着,虽然看不太懂,但是整洁、齐全、有注释,结构合理)
#每天一个知识点#展开赞过评论3 - 多线程中的栅栏 barrier 是什么?
先说点背景知识,iOS 开发中经常会用队列来调度 block 的执行,并发队列支持多个 block 同时执行(只要开多几个线程),串行队列让 block 只能一个一个执行,一个 block 执行完,另一个 block 才能开始。
栅栏函数就是用在并发队列中的,为的就是在并发队列中拿一点先后顺序。因为栅栏函数分配的 block A,会等这个队列中其他 block 执行完,然后到 blockA 单独执行,它执行完,然后才是队列其他中排在它后面的 block 执行。
这就相当于在无序的并发队列中拿到了一点「顺序」。
这么做的原因就是最大程度利用系统性能,顺序不敏感的 block 直接放进去,开多几个线程一起执行,对顺序有要求的 block 我就用栅栏函数放进去
图为 AFNetworking 图片下载器中添加图片缓存的逻辑,就用到了 barrier 来保证「添加图片」和「删除图片」的先后顺序
#每天一个知识点#展开赞过评论2