【问题标题】:Better Performance in SwiftUI: Creating a new view OR using a function with @ViewBuilder更好的 SwiftUI 性能:创建新视图或使用带有 @ViewBuilder 的函数
【发布时间】:2021-10-14 05:51:42
【问题描述】:

在 SwiftUI 中使用不同的视图组合时,我们可以采取两种方法:

  1. 在视图中使用一些@ViewBuilder 函数作为辅助函数:
@ViewBuilder func makeButtonLabel() -> some View {
    if isPlaying {
        PauseIcon()
    } else {
        PlayIcon()
    }
}
  1. 为该 UI 片段创建不同的视图:
struct SongRow: View {
    var song: Song
    @Binding var isPlaying: Bool
    ...

    var body: some View {
        HStack {
            if isPlaying {
                PauseIcon()
            } else {
                PlayIcon()
            }
        }
    }
}

我想知道哪个更好,我们如何衡量它?

从分析上看,在我看来,第二个在更大的视图块中具有更好的性能,尤其是我们可以在预览的加载时间看到它,但我没有任何线索。

【问题讨论】:

    标签: swift xcode swiftui swiftui-previews


    【解决方案1】:

    您可以假设性能差异可以忽略不计(如果有的话)。 structs 的重量很轻 - 选择在您的上下文中最有意义的那个。此外,您不需要在第二个示例中使用 HStack,因为 body 隐含地是 @ViewBuilder

    最后,由于没有可衡量的影响,因此两者都不比另一个更好。

    通常,我更喜欢拆分越来越大的视图,或者将其作为自己的视图更有意义。例如:

    • 如果您的视图组件严重依赖当前结构实例中的属性,您可以创建一个新的@ViewBuilder var buttonLabel: some View/@ViewBuilder func makeButtonLabel() -> some View 并轻松访问相同的属性。

    • 如果属性不相关,则将其拆分为单独的视图。这样做还可以更轻松地在整个应用中重用,并在 SwiftUI 预览中运行。

    【讨论】:

    • Apple 很清楚这两种方式都没有真正影响性能。这完全取决于您希望如何组织代码。
    • @Yrb 谢谢,在哪个 Apple 文档中提到了它?
    • 他们在 WWDC 上强调了这一点。它在一堆视频中。当它被编译时,它会被扁平化到一个视图中,所以没有惩罚
    猜你喜欢
    • 2020-06-09
    • 1970-01-01
    • 1970-01-01
    • 2020-12-28
    • 1970-01-01
    • 2021-04-26
    • 2020-09-13
    • 2019-10-25
    • 2020-05-25
    相关资源
    最近更新 更多