美文网首页
YYAsyncLayer异步绘制

YYAsyncLayer异步绘制

作者: iOS博仔 | 来源:发表于2020-04-18 15:16 被阅读0次

    前言

    YYAsyncLayer是异步绘制与显示的工具。最初是从YYKitDemo中接触到这个工具,为了保证列表滚动流畅, 将视图绘制、以及图片解码等任务放到后台线程, 在YYAsyncLayer之前还是想从YYKitDemo中性能优化说起,我在说什么呢~下面呢来说正题。

    YYKitDemo

    对于列表主要对两个代理方法的优化, 一个与绘制显示有关, 另一个与计算布局有关:

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;  
    

    常规逻辑可能觉得应该先调用tableview: cellForRowAtIndexPath: 返回 UITableViewCell对象, 事实上调用顺序是先返回UITableViewCell的高度 ,是因为UITableView继承自UIScrollView, 滑动范围由属性contentSize来确定, UITableView的滑动范围需要通过每一行的UITableViewCell的高度计算确定, 复杂cell如果在列表滚动过程中计算可能会造成一定程度的卡顿。
     假设有20条数据, 当前屏幕显示5条, tableView : heightForRowAtIndexPath :方法会先执行20次后返回所有高度并计算出滑动范围,tableView : cellForRowAtIndexPath : 执行5次返回当前屏幕显示的cell个数。


    TableViewOfPerformanceOptimization.png

    从图中简单看下流程, 从网络请求返回JSON数据, 将Cell的高度以及内部视图的布局封装为Layout对象,Cell显示之前在异步线程计算好所有布局对象, 并存入数组,每次调用tableView: heightForRowAtIndexPath : 只需要从数组中取出,可避免重复的布局计算 。同时在调用tableView: cellForRowAtIndexPath : 对Cell内部视图异步绘制布局, 以及图片的异步绘制解码, 这里就要说到今天的主角YYAsyncLayer。

    相关文章

      网友评论

          本文标题:YYAsyncLayer异步绘制

          本文链接:https://www.haomeiwen.com/subject/usqbvhtx.html