如何将 SwiftUI 视图包装在 ASDisplayNode 中

How to wrap a SwiftUI View inside a ASDisplayNode

今天我想找出一种连接 SwiftUI 和 Texture (AsyncDisplayKit) 的方法。

通过这种方式,我可以在详细视图中获得 AsyncDisplayKit、ASNetworkImage 等的速度和优势,以及 SwiftUI 和 Combine 的灵活性。

连接 SwiftUI 和纹理/AsyncDisplayKit

我们可以初始化一个节点并提供一个 SwiftUI 视图作为后台视图。 Text 视图嵌套在一个 UIHostingController 中,一个 UIViewController 子类表示 UIKit 上下文中的 SwiftUI 视图。

视图是通过一个块提供的,该块将 return 一个视图,以便可以保存视图的实际构造以备后用。节点显示步骤是同步发生的,因为节点只有在包裹了 _ASDisplayView(内部视图子类)时才能异步显示,而不是在包裹了 UIView.

时才能异步显示
//
//  HostingNode.swift
//

import AsyncDisplayKit
import SwiftUI

class HostingNode: ASDisplayNode {

    var viewController: UIViewController?

    override init() {
        super.init()

        setViewBlock { [weak self]() -> UIView in
            self?.viewController = self?.makeHostingController()
            return self?.viewController?.view ?? UIView()
        }
    }

    private func makeHostingController() -> UIViewController {
        UIHostingController(
            rootView: Text("Attention")
        )
    }
}

参考文献: