图片来源:
raywenderlich
主线程中一些比较耗时的操作:
- 尺寸计算和约束:
heightForRowAtIndexPath
或者是sizeThatFits
- 图片解码
- 绘制
- 对象生命周期的管理
介绍ASDisplayNode
ASDisplayNode是对UIView的封装,类似于UIView和CALayer的关系。和UIView不同的是,Node默认在后台队列并发进行渲染。
Node容器类
Node真正发挥功效是和以下四个容器类结合的时候:
- ASViewController :继承自UIViewController,你可以为该控制器提供被管理的Node。
- ASCollectionNode and ASTableNode :类似于UICollectionView和UITableView
- ASPagerNode :相比于UIPageViewController,提供更强大的滑动性能。
总结方法-tableNode:nodeBlockForRowAtIndexPath:
:
-
ASCellNode
类似于UITableViewCell
,有一点需要去注意,类似于-tableView:cellForRowAtIndexPath:
的方法-tableNode:nodeBlockForRowAtIndexPath:
返回值是一个block-ASCellNodeBlock
。这是因为ASTableNode
内容维护所有的cell,并且为indexPath返回一个block,当它准备好的时候,它能并发初始化所有的Cell。 - block中的返回值必须是
ASCellNode
。
总结方法-tableView:
- 这个方法取代
tableView:heightForRowAtIndexPath
。 - 在ASDK中,所有的
ASCellNode
负责定义他们自己的size。在该方法中你可以可选的定义一个最小和最大的size为你的cell。
ASRangeController
每一个被这个容器包含的node会有以下三种状态:
- Preload Range :处于这个状态的node要用来获取model。
- Display Range :处于这个状态的node要用来绘制文本,图片解码。
- Visible Range : 处于这个状态的node要用来显示在屏幕上。
Node接口状态(interfaceState)回调
这些node的状态是如何正确的协调工作的?
每个node都有一个interfaceState
的属性,所有的node被ASRangeController统一协调更新。
幸运的是我们不需要直接操作node的interfaceState
属性,我们只需在 interface state 回调中做出响应即可。
给Node命名
为了在滚动过程中观察每个node的状态,我们可以通过如下方法给node命名:
在-tableNode:nodeBlockForRowAtIndexPath:
中添加如下方法d
node.debugName = [NSString stringWithFormat:@"cell %zd", indexPath.row];