实现Request Review功能时屏幕卡顿、CPU占用过高问题求助
RequestReview引发的卡顿、高CPU及内存增长问题排查与解决建议
问题现象
在实现Request Review功能时,每次从包含@Environment(\.requestReview)属性的页面切换到使用@ObservedObject的页面,会触发以下问题:
- 屏幕出现卡顿
- CPU占用率显著升高
- 控制台无规律多次打印
_requestReview changed日志 - 内存呈现持续增长趋势
可复现代码
import SwiftUI import Foundation import StoreKit struct ContentView: View { var body: some View { let _ = Self._printChanges() VStack(spacing: 40) { Image(systemName: "soccerball") .imageScale(.large) .foregroundColor(.accentColor) Text("Football School") NavigationLink { StudentListView() } label: { Text("Click for Student List") } .buttonStyle(.borderedProminent) } .padding() } } struct StudentListView: View { @Environment(\.requestReview) private var requestReview var body: some View { let _ = Self._printChanges() VStack(spacing: 40) { Text("Student List") NavigationLink { StudentDetailView() } label: { Text("Click for Student Detail") } .buttonStyle(.borderedProminent) } .padding() } } final class Test: ObservableObject {} struct StudentDetailView: View { @ObservedObject var test = Test() var body: some View { let _ = Self._printChanges() VStack(spacing: 40) { Image(systemName: "globe") .imageScale(.large) .foregroundColor(.accentColor) Text("Hello, world!") } .padding() } } struct ContentView_Previews: PreviewProvider { static var previews: some View { ContentView() } }
相关截图
- 控制台日志:

- CPU占用过高:

- 内存持续增长:

排查分析与解决建议
问题根源
@Environment(\.requestReview)的实例在页面切换过程中可能被频繁触发更新,结合@ObservedObject在视图刷新时会重新初始化实例的特性,导致SwiftUI视图进入循环刷新状态,最终引发高CPU占用、内存增长及界面卡顿。
修复方案
优化requestReview的使用时机
避免在视图中直接持有@Environment(\.requestReview)属性,改为在需要触发评分的动作中临时获取,减少不必要的监听:struct StudentListView: View { var body: some View { let _ = Self._printChanges() VStack(spacing: 40) { Text("Student List") NavigationLink { StudentDetailView() } label: { Text("Click for Student Detail") } .buttonStyle(.borderedProminent) // 仅在需要时获取requestReview Button("请求评分") { Environment(\.requestReview).wrappedValue() } } .padding() } }替换@ObservedObject为@StateObject
在StudentDetailView中,@ObservedObject用于在视图内部初始化的ObservableObject时,会导致视图每次刷新都重新创建实例。改用@StateObject可以保持对象实例的唯一性,避免不必要的对象创建和视图刷新:struct StudentDetailView: View { @StateObject var test = Test() // 替换@ObservedObject var body: some View { let _ = Self._printChanges() VStack(spacing: 40) { Image(systemName: "globe") .imageScale(.large) .foregroundColor(.accentColor) Text("Hello, world!") } .padding() } }验证效果
修改代码后运行项目,观察控制台是否仍频繁打印_requestReview changed,同时通过Xcode的Debug Navigator监控CPU和内存占用情况,确认卡顿问题是否得到缓解。
内容的提问来源于stack exchange,提问作者byaruhaf
相关产品推荐
相关产品推荐

