为什么我的应用程序在模拟器中运行,但在设备上冻结?

问题描述 投票:0回答:1

我的应用程序总体运行良好,具有所有功能。但是我添加的一个新按钮/功能会冻结设备上的应用程序,但在模拟器中可以完美运行。我在这里检查了类似的问题,并找到了一种重新启动设备和 Xcode 的通用解决方案。正如我预期的那样,它没有帮助。

我预料到了这种行为,因为这是第二次发生这种情况。该按钮在模拟器中工作并在设备上冻结。上次我注释掉了所有代码,直到找到导致问题的一行。这是定时器的初始化。将其移入体内就解决了问题。

import SwiftUI
import AVFoundation
import SwiftData
import CoreHaptics  /// For making vibrations once the timer is run out


struct TimerTapasFullView: View {
    @Environment(\.dismiss) var dismiss         /// To be able to dismiss the view
    
    @State var countdownTimer = 5 * 60          /// The actual seconds of the timer, being counted down/up
    @State var timerRunning = true              /// Var to set and see if timer is running
    @State var gongSound: AVAudioPlayer?        /// The Sound of the timer
    
    @State private var hours: Int = 0           /// Vars for the picker wheel
    @State private var minutes: Int = 0
    @State private var seconds: Int = 0
    
    @State private var brightnessLow = false    /// Var for saving if the brightness button was used
    
    @State private var engine: CHHapticEngine?  /// The object creating the vibrations later on
    @Environment(\.scenePhase) var scenePhase   /// Var to keep track of state of app, to restart HapticEngine
    
    /// Environment Objects
    @EnvironmentObject var userStat: StatisticsObject       /// Var to keep track of seconds using the Timer
    @EnvironmentObject var envObject: EnvObject             /// For getting FullDarkness, vibrateTimer
    
    /// Variables from the Tapas for setting the timer
    @State var asanas: [TapasAsana]
    @State var asana: TapasAsana
    @State var nextAsana = TapasAsana()

    let path = Bundle.main.path(forResource: "bell_basu.mp3", ofType:nil)!
    
    var body: some View {
        /// Initiate the timer
        let timer = Timer.publish(every: 1, on: .main, in: .common).autoconnect()
        
        /// For calculating hours, minutes, seconds
        let style = Duration.TimeFormatStyle(pattern: .minuteSecond)
        //let formTimer = Duration.seconds(countdownTimer).formatted()
        let formTimerShort = Duration.seconds(countdownTimer).formatted(style)
        let url = URL(fileURLWithPath: path)
        
        VStack {
        ... more code follows...

这是第一次导致此行为的行:

让计时器 = Timer.publish(every: 1, on: .main, in: .common).autoconnect()

现在我添加了新功能,包括这一行: @State var nextAsana = TapasAsana()

我对此有很多疑问。有谁知道为什么它在模拟器中完美运行而不是在设备上运行?这样我总是检查模拟器,当我在设备上的编码会话后检查时,我不知道我所做的许多更改中的哪一个导致了这种冻结。

发生这种情况时,Xcode 中的调试器不会显示任何内容。有什么方法可以让它更详细地显示设备上发生的情况吗?

您知道为什么会发生这种情况吗?我的代码是否有错误或者我是否使用了导致冻结的不良做法?

我将非常感激理解这个大问题,感谢您的帮助。

ios swift xcode swiftui freeze
1个回答
0
投票

问题可能来自于初始化 TapasAsana() 或直接在主体中创建计时器。由于资源限制或重新渲染期间的重新初始化,这可能会导致设备出现意外行为。

修复:

  1. 将计时器初始化移到主体之外:
@State private var timer = Timer.publish(every: 1, on: .main, in: .common).autoconnect()
  1. nextAsana 的延迟初始化:
@State var nextAsana: TapasAsana? = nil

init(asanas: [TapasAsana], asana: TapasAsana) {
    self._nextAsana = State(initialValue: TapasAsana())
}
  1. 设备上调试:
  • 在 Xcode 中使用“异常暂停”。
  • 仪器配置文件(时间 Profiler)来定位瓶颈。

很可能是 TapasAsana() 或您的计时器逻辑导致冻结。避免直接在主体或状态变量中进行复杂的初始化。

© www.soinside.com 2019 - 2024. All rights reserved.