AsyncDisplayKit中ASTableNode和ASCo
2018-04-21 本文已影响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也可以异步渲染.
在翻阅ASTableNode的API时, 发现 屏幕快照 2018-04-21 上午11.58.36.png 这个方法是在主线程中的, 也就是意味着可以将tableNode整体的cell布局放在主线程, 而将collectionNode的cell布局写在异步渲染中, 因为我们最终展示的内容是在collectionNode中的, 而该方法在Texture的demo中也有所实现:
后来思考一个问题, 如果我仅仅嵌套的是collectionNode, 而不需要其它的组件, 这样做有没有其它的方法, 而我们知道didLoad是在主线程的, 那我们如果想用CSS布局的自适应高度呢?
tableCellNode:
屏幕快照 2018-04-21 下午12.03.17.png
而collectionNode就可以用原来的方法异步渲染:
屏幕快照 2018-04-21 下午12.04.20.png
这样就解决了简单嵌套问题的纯CSS布局问题.