Post

Telegram研究:使用viewClass或setViewBlock自定义view方便debug定位

Telegram研究:使用viewClass或setViewBlock自定义view方便debug定位

前言

由于Telegram的代码量太大,而且显示的几乎全是_ASDisplayView,很多node文件有4000~5000行代码,导致调试查看十分麻烦,AsyncDisplayKitASDisplayNode提供了设置自定义类的方法,可以在debug时方便定位问题

setViewBlock的优先级要高于viewClass

方案一、在ASDisplayNode子类里设置setViewBlock

例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
private final class ChatControllerNodeView: UITracingLayerView, WindowInputAccessoryHeightProvider {

.....

}

class ChatControllerNode: ASDisplayNode, ASScrollViewDelegate {

         init(context: ......) {

            .........

         // 提在ASDisplayNode的子类里设置setViewBloc,返回一个UIView的子类实例即可

          self.setViewBlock({

                  return ChatControllerNodeView()

         })

         ..........

        }

}

ListView都通过setViewBlock默认设置了ListViewBackingView
源码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
open class ListView: ASDisplayNode, ASScrollViewDelegate, ASGestureRecognizerDelegate {

        override public init() {

              // ...
                 self.setViewBlock({ () -> UIView in

                    return ListViewBackingView()

               })

              // ...

       }

}

方案二、重写ASDisplayNode子类的viewClass方法

例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePreviewItemNode {

    #if DEBUG
    // 提供一个_ASDisplayView的子类即可
    class ChatMessageBubbleItemNodeView: _ASDisplayView { }

    // 提在ASDisplayNode的子类里重写viewClass方法,返回个_ASDisplayView的子类的类型即可
    override public class func viewClass() -> AnyClass {
        return ChatMessageBubbleItemNodeView.self
    }
    #endif

    // ...
}
This post is licensed under CC BY 4.0 by the author.