实现说明¶
正在进行中…
目前我们只有关于 Swift 运行时实现的说明。它们实际上与 Kotlin 中的实现非常接近,特别是 WorkflowNode
和 SubtreeManager
类。
Swift¶
渲染循环¶
首次遍历¶
你的 workflow 层次结构的根被放入一个 WorkflowHost
中(如果你使用 ContainerViewController
,这个类会为你创建)。作为其初始化器的一部分,WorkflowHost
创建一个 WorkflowNode
来包装给定的根 Workflow
(并跟踪该 Workflow
的 State
)。然后它在这个节点上调用 render()
// WorkflowHost
public init(workflow: WorkflowType, debugger: WorkflowDebugger? = nil) {
self.debugger = debugger
self.rootNode = WorkflowNode(workflow: workflow) // 1. Create the node
self.mutableRendering = MutableProperty(self.rootNode.render()) // 2. Call render()
WorkflowNode
包含一个 SubtreeManager
,其主要目的是管理子 workflows(稍后会详细介绍)。当在节点上调用 render()
时,它会在 SubtreeManager
上调用 render
,并传递一个闭包,该闭包接受一个 RenderContext
并返回与该节点关联的 Workflow
的 Rendering
。
// WorkflowNode
func render() -> WorkflowType.Rendering {
return subtreeManager.render { context in
return workflow.render(
state: state,
context: context
)
}
}
SubtreeManager
实例化一个 RenderContext
并调用传入的闭包。这最后一步生成了 Rendering
。然后这个 Rendering
会沿着调用栈回传,直到到达 WorkflowHost
。
组合¶
在 Workflow
包含子 Workflow
的情况下,渲染顺序类似。该 [教程] (../tutorial/building-a-workflow/#the-render-context) 更详细地介绍了这一点。
本质上,一个包含子 Workflow
的 Workflow
会在每个子 Workflow
上调用 render(context:key:outputMap:)
并传入 RenderContext
。上下文会为子 Workflow
进行一些簿记工作(创建或更新一个 ChildWorkflow<T>
),然后调用 render()
。ChildWorkflow<T>.render()
在其 WorkflowNode
上调用 render()
,然后我们递归回到步骤 2。