AsyncDisplayKit中ASTableNode和ASCollectionNode嵌套问题

在上一个项目中曾经用到了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布局问题.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 我与他相识在初三,当时我的座位在第二排,而他坐在与我相隔甚远的最后 。他和我的一从小学就是好朋友的妹子是同桌。因为...
    栗子薯片土豆泥阅读 4,019评论 0 0
  • #幸福是需要修出来的~每天进步1%~幸福实修14班~嘿,天鹅!lv# 20180406(244/一辈子) 【幸福实...
    嘟嘟妈妈2727阅读 3,895评论 0 1

友情链接更多精彩内容