当前位置: 首页 > news >正文

iOS一直讲的单元格优化

1 复用Cell(dequeueReusableCellWithIdentifier:);
2 异步解码图片、离屏渲染(如使用CATiledLayer);
3减少AutoLayout计算,预计算Cell高度;
4 使用willDisplayCell延迟加载非关键资源

异步解码图片、离屏渲染(如使用CATiledLayer)这两个之前没有开发过,今天写一个demo记录一下

/*异步解码图片,避免单元格卡顿当你用 UIImage(named:) 或 UIImage(data:) 加载图片时,系统会延迟解码(lazy decode):•    图片只在真正显示到屏幕上时才会解码。•    解码操作发生在主线程上 → 容易造成 UI 卡顿(掉帧)。*/
class DecodeImages {//可以结合 DispatchSemaphore 控制并发,避免同时解码过多大图导致内存暴涨//信号量限制最大解码数量为2let semaphore = DispatchSemaphore(value: 2)let queue = DispatchQueue(label: "www.baidksk.com",attributes: DispatchQueue.Attributes.concurrent)func asyncDecodeImage(_ data: Data, complete: @escaping (UIImage?)->Void) {semaphore.wait()defer {semaphore.signal()}guard let imageSource = CGImageSourceCreateWithData(data as CFData, nil),let cgImage = CGImageSourceCreateImageAtIndex(imageSource, 0, nil) else {DispatchQueue.main.async {complete(nil)}return}let decodedImage = UIImage(cgImage: cgImage,scale: UIScreen.main.scale,orientation: .up)DispatchQueue.main.async {complete(decodedImage)}}}
/*当一张超大图(如地图、PDF、超高清图)显示在 UIScrollView 或 CALayer 上时,如果一次性全部解码、渲染,会非常消耗内存。解决思路使用 CATiledLayer 分块(tile)绘制:系统只绘制当前可见区域的部分图块,每块独立解码与渲染。•    CATiledLayer 自动多线程渲染;•    每个 tile 的渲染在后台进行;•    iOS 系统内部使用 GCD 调度线程;•    你可以通过 DispatchSemaphore 控制最大渲染任务数量,以防 GPU/CPU 占用过高。*/class OutScreenRenderView : UIView {private let image: CGImageoverride class var layerClass: AnyClass {CATiledLayer.self}init(image: CGImage) {self.image = imagesuper.init(frame: .zero)let titleLayer = self.layer as! CATiledLayertitleLayer.levelsOfDetail = 4titleLayer.tileSize = CGSize(width: 256, height: 256)contentScaleFactor = 1.0}required init?(coder: NSCoder) {fatalError("init(coder:) has not been implemented")}override func draw(_ layer: CALayer, in ctx: CGContext) {let rect = ctx.boundingBoxOfClipPathlet scale = layer.contentsScalelet imageRect = CGRect(x: 0, y: 0, width: CGFloat(image.width), height: CGFloat(image.height))ctx.saveGState()ctx.translateBy(x: 0, y: imageRect.size.height)ctx.draw(image, in: rect)ctx.restoreGState()}
}
http://www.dtcms.com/a/470099.html

相关文章:

  • 信阳网站seo用手机怎么做网站
  • 【Canvas技法】 卡通版太阳的三种画法
  • 词根学习笔记 | Agri系列
  • PHP解决跨域请求问题的两种实用方法
  • 语音大模型自监督训练思路
  • 辉芒微单片机FT60E12X,Touch 系列8位单片机MCU简要分析
  • w3c网站代码标准规范自己做的网站怎么接入网页游戏
  • 一篇文章详细解析 IPv4地址
  • 主办单位性质与网站名称不符绍兴专业做网站公司
  • C++ 简介
  • ValueTuple 详解
  • 框架--MyBatis
  • 1.C++基础(上)
  • cursor一些简单的使用心得官方的建议
  • 新能源汽车公司如何落地 ASPICE
  • 网站建设中的注册和登录页面网站开发技术期末考试题
  • react hooks
  • 建立数据分析与决策体系
  • 昂瑞微:全链条创新引领中国“芯”突围
  • Js逆向最新boss直聘__zp_stoken__-某boss逆向
  • Oracle ORA-01653 错误检查以及解决笔记
  • wordpress 做购物网站购买主机可以做网站吗
  • C#合并产品价格对比实战
  • 链表OJ(十六)146. 模拟LRU 缓存 双向链表+哈希
  • 旧物新生:一款回收小程序如何让环保成为举手之劳
  • seo网站优化服务去哪个网站找题目给孩子做
  • MATLAB实现对角加载波束形成算法
  • 从嵌入式到社区物联网:基于Pegasus智能家居套件的全栈实验方案
  • Vue + Spring Boot 实现 Excel 导出实例
  • 服务器关闭 网站被kseo搜索引擎优化策略