You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

实现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()
    }
}

相关截图

  • 控制台日志:控制台打印_requestReview changed
  • CPU占用过高:CPU占用率过高
  • 内存持续增长:内存持续上升

排查分析与解决建议

问题根源

@Environment(\.requestReview)的实例在页面切换过程中可能被频繁触发更新,结合@ObservedObject在视图刷新时会重新初始化实例的特性,导致SwiftUI视图进入循环刷新状态,最终引发高CPU占用、内存增长及界面卡顿。

修复方案

  1. 优化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()
        }
    }
    
  2. 替换@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()
        }
    }
    
  3. 验证效果
    修改代码后运行项目,观察控制台是否仍频繁打印_requestReview changed,同时通过Xcode的Debug Navigator监控CPU和内存占用情况,确认卡顿问题是否得到缓解。

内容的提问来源于stack exchange,提问作者byaruhaf

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 14:54:55