CK Tree Node
CKTreeNodeit's our representation of a component in the new component tree.- It has a unique identifier
- Holds
CKComponentScopeHandle(state + controller) if needed. - Being constructed by the infra when we call
buildComponentTree: - The equivalent of
CKComponentScopeFramein our new infrastructure
CKTreeNodeWithChild- Holds one child and its component key
CKTreeNodeWithChildren- Holds a map of component key → tree nodes to; component key is a tuple of <component class, counter>
- Every component (even non-render) has a tree node once there is a render component in the tree
Example:
@implementation AComponent{NSString *_text;}+ (instancetype)newWithText:(NSString *)text{auto const c = [super new];if (c) {c->_text = text;}return c;}- (CKComponent *)render:(id)state{return [CKTextComponent newWithText:text];}@end
Will translate into this tree:

Scopes (non-render world)
What do we have without CKRenderComponent?
CKComponentScope- Being created on the stack
- Has 3 parameters:
CKComponentScope(class, identifier, initialStateBlock)
CKComponentScopeFrame- An obj-c object. Represent a component with scope in the component tree
CKComponentScopeHandle- Holds the state, the controller, an identifier and the component.
- Each
CKComponentScopeFrameholdsCKComponentScopeHandle;you can see it as the value of the frame tree
Example:
@implementation AComponent- (instancetype)newWithText:(NSString *)text{CKComponentScope scope(self);auto const c =[super newWithComponent:[CKTextComponentnewWithText:text]];if (c) {// Do something}return c;}@end
Will translate into this tree:

We can see the the component tree doesn't have any representation for the CKTextComponent.
Build Component Tree
- As we just saw in the, we build a full component tree (CKTreeNode) in case that we have a render component in the tree.
- The way we build the component tree is by calling the following method on the root component:
- (void)buildComponentTree:(id<CKTreeNodeWithChildrenProtocol>)parentpreviousParent:(id<CKTreeNodeWithChildrenProtocol>)previousParentparams:(const CKBuildComponentTreeParams &)paramsconfig:(const CKBuildComponentConfig &)confighasDirtyParent:(BOOL)hasDirtyParent;
- Each component is responsible to build its tree node and continue the recursion for its children.
- This method is responsible to call the render method on render components (or reuse the previous component if possible).
- We implemented this method in all our base classes:
CKComponentCKCompositeComponentCKRenderComponentCKRenderWithChildrenComponent