跳到内容

实现说明

正在进行中…

目前我们只有关于 Swift 运行时实现的说明。它们实际上与 Kotlin 中的实现非常接近,特别是 WorkflowNodeSubtreeManager 类。

Swift

渲染循环

首次遍历

workflow rendering sequence diagram

你的 workflow 层次结构的根被放入一个 WorkflowHost 中(如果你使用 ContainerViewController,这个类会为你创建)。作为其初始化器的一部分,WorkflowHost 创建一个 WorkflowNode 来包装给定的根 Workflow(并跟踪该 WorkflowState)。然后它在这个节点上调用 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 并返回与该节点关联的 WorkflowRendering

// 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) 更详细地介绍了这一点。

nested workflow rendering sequence diagram

本质上,一个包含子 WorkflowWorkflow 会在每个子 Workflow 上调用 render(context:key:outputMap:) 并传入 RenderContext。上下文会为子 Workflow 进行一些簿记工作(创建或更新一个 ChildWorkflow<T>),然后调用 render()ChildWorkflow<T>.render() 在其 WorkflowNode 上调用 render(),然后我们递归回到步骤 2。