美文网首页Texture
AsyncDisplayKit中ASTableNode和ASCo

AsyncDisplayKit中ASTableNode和ASCo

作者: 那年那月那花儿 | 来源:发表于2018-04-21 12:05 被阅读425次

    在上一个项目中曾经用到了AsyncDisplayKit解决列表界面包含很多实时charts数据刷新, 而界面又过于复杂造成的卡顿问题,


    WechatIMG2.jpeg

    曾经在刚用该库时遇到tableNode嵌套collectionNode的异步渲染问题->
    写cell方法时tableNode用 :

    • (ASCellNodeBlock)tableNode:(ASTableNode *)tableNode nodeBlockForRowAtIndexPath:(NSIndexPath *)indexPath,

    collectionNode用:

    • (ASCellNodeBlock)collectionNode:(ASCollectionNode *)collectionNode nodeBlockForItemAtIndexPath:(NSIndexPath *)indexPath,

    而collectionNode的布局是写在tableNode中的

    • (ASLayoutSpec *)layoutSpecThatFits:(ASSizeRange)constrainedSize
      这样直接导致崩溃, 查询的结果是显示线程问题, 列表视图不能嵌套异步渲染, 就如同collectionNode你要异步渲染, 其中的collectionCellNode也异步渲染, 在线程上是不允许的(开始没看原理, 学艺不精).
      为此当时想出了一个解决方案, 将collectionNode的布局写在


      屏幕快照 2018-04-21 上午11.40.52.png

      这样确实解决了两个列表的异步渲染问题; tableNode中的charts部分可以异步渲染, 而collectionNode中的cellNode也可以异步渲染.
      后来思考一个问题, 如果我仅仅嵌套的是collectionNode, 而不需要其它的组件, 这样做有没有其它的方法, 而我们知道didLoad是在主线程的, 那我们如果想用CSS布局的自适应高度呢?

      在翻阅ASTableNode的API时, 发现 屏幕快照 2018-04-21 上午11.58.36.png 这个方法是在主线程中的, 也就是意味着可以将tableNode整体的cell布局放在主线程, 而将collectionNode的cell布局写在异步渲染中, 因为我们最终展示的内容是在collectionNode中的, 而该方法在Texture的demo中也有所实现:
      tableCellNode:
      屏幕快照 2018-04-21 下午12.03.17.png
      而collectionNode就可以用原来的方法异步渲染:
      屏幕快照 2018-04-21 下午12.04.20.png

      这样就解决了简单嵌套问题的纯CSS布局问题.

    相关文章

      网友评论

        本文标题:AsyncDisplayKit中ASTableNode和ASCo

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