Apple Instruments View Body无法记录SwiftUI Text视图调用,如何排查卡顿?
SwiftUI原生视图(如Text)的性能排查问题
测试场景与现象
我编写了一段测试代码,故意让SwiftUI一次性绘制数千个Text("Child")视图来制造卡顿——由于ChildView被包裹在VStack中,子ForEach内的视图会被即时全部创建:
import SwiftUI struct ParentView: View { var body: some View { List { ForEach(0..<10) { parentIndex in VStack { Text("Parent \(parentIndex + 1 )") ChildView() } } } .padding() } } struct ChildView: View { var body: some View { ForEach(0..<1000) { childIndex in Text("Child") .frame(minHeight: 200) } } }
对这段代码做性能分析时,卡顿现象符合预期。但在卡顿的检查范围内,Instruments的View Body工具输出显示:SwiftUI通道共有95次视图body调用,测试应用(NestedForEach)通道仅有8次——原生Text视图的调用并未被记录。
这是因为SwiftUI原生视图的body在编译时无法直接访问,导致View Body工具无法追踪到它的调用。
之后我将代码修改为用自定义TextView包裹原生Text:
import SwiftUI struct ParentView: View { var body: some View { List { ForEach(0..<10) { parentIndex in VStack { Text("Parent \(parentIndex + 1 )") ChildView() } } } .padding() } } struct ChildView: View { var body: some View { ForEach(0..<1000) { childIndex in TextView() .frame(minHeight: 200) } } } struct TextView: View { var body: some View { Text("Child") } }
使用自定义视图后,View Body工具显示测试应用通道中TextView的body被调用了5000次,终于能看到视图创建的次数。
寻求解决方案
我想知道:
- 无需创建自定义视图,能否通过Instruments查看
Text这类SwiftUI原生视图的调用? - 有没有其他方法可以排查此类卡顿问题?
内容的提问来源于stack exchange,提问作者samhastings1066
相关产品推荐
相关产品推荐

