AsyncDisplayKit踩坑小计之一

1,530 阅读2分钟

出于对新技术的渴求,我对公司电商项目的首页进行了重构,采用了AsyncDisplayKit,通过Carthage 导入。
如图,界面属于相对稍微复杂的滚动视图,由一个大的纵向滚动视图,包含若干个横向滚动视图组合而成。
1

在这里,我采取的方案是:1个主ASCollectionNode 负责总线滚动,若干个小的ASCollectionNode嵌入到每个ASCellNode 中,并将每个ASCellNode 中的ASCollectionNode 的数据源以及代理 委托给 主视图的ASCollectionNode。

一顿逻辑布局,终于完成。

可是这时候问题来了,在Xcode8模拟器以及连真机,总会出现初次启动崩溃的情况,而第二次则不会,代码错误定格在ASCollectionNode 的ASCollectionView 初始化上。
2

思来想去肯定是AsyncDisplay 的问题,百度谷歌找遍了,由于AsyncDisplay 本来就是新技术,国内几乎没有对应的bug 文章来对这方面的bug 做阐述,没办法,硬着头皮上github 找原因。在这里找到了类似的问题issue 提问,提到了通过 automaticallyManagesSubnodes 取值YES 来完成。如图。
3

尝试了一下,顺利清除 bug,清除模拟器,再次编译运行,崩溃不会出现了。

多次尝试均无问题。问题顺利解决。

总结:在复杂的布局中,AsyncDisplayKit 对于ASCellNode 添加的ASCollectionNode 应该是初始化即开始布局,而此时父视图的数据还未传入,所以会导致生成空指针。通过设置 automaticallyManagesSubnodes = YES,让布局交给AsyncDisplay 来做管理,有效防止初始化时父视图无数据的问题,避免空指针引发崩溃。

PS. 我在github 上留言了,告诉他这个解决方案是成立的…
4

记一次坑爹的升级IPv6