美文网首页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