实现说明¶
正在进行中…
目前我们只有关于 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。