【问题标题】:My iOS app freezes but no error appears我的 iOS 应用程序冻结但没有出现错误
【发布时间】:2014-02-21 00:13:13
【问题描述】:

是否有人知道我需要检查应用程序是否在一段时间后冻结?我的意思是,我可以在 iPhone 屏幕上看到该应用程序,但没有任何视图响应。

我做了一些谷歌,我发现,我已经以某种方式阻止了主线程。

但我的问题是如何识别导致主线程阻塞的方法?有什么方法可以识别吗?

【问题讨论】:

  • 在主线程上运行你的进程...
  • 我的项目中有很多进程都在后台线程上运行,比如下载图像、活动指示器的动画、加载表格视图等。我应该在主线程上运行哪个?
  • 也许可以描述更多你的应用在做什么,当你被冻结时显示一些你正在执行的代码
  • 嗯,我认为这就是问题所在......您同时运行了太多进程......尝试在前一个线程完成时启动一个线程......
  • 当我从一个选项卡导航到多个页面时,应用程序会冻结。

标签: ios iphone multithreading ipad freeze


【解决方案1】:

我相信应该可以定期检查主线程是否被阻塞或冻结。您可以像这样创建一个对象:

final class FreezeObserver {
    
    private let frequencySeconds: Double = 10
    private let acceptableFreezeLength: Double = 0.5
    
    func start() {
        DispatchQueue.global(qos: .background).async {
            
            let timer = Timer(timeInterval: self.frequencySeconds, repeats: true) { _ in
                
                var isFrozen = true
                
                DispatchQueue.main.async {
                    isFrozen = false
                }
                
                DispatchQueue.global(qos: .background).asyncAfter(deadline: .now() + self.acceptableFreezeLength) {
                    guard isFrozen  else { return }
                    
                    print("your app is frozen, so crash or whatever")
                }
            }
        
            let runLoop = RunLoop.current
            runLoop.add(timer, forMode: .default)
            runLoop.run()
        }
    }
}

2021 年 10 月更新: 如果您不想自己滚动,Sentry 现在提供冻结观察功能。

【讨论】:

    【解决方案2】:

    可能是另一个视图未正确关闭,它阻止了用户交互!检查UI Debugger,再看顶层,看看有没有什么奇怪的地方。

    【讨论】:

      【解决方案3】:

      大多数情况下,当我在 INFINITE 时间内要求进行设计更改时,就会发生这种情况。哪个功能可以做到这一点?嗯,就是这个:

      override func viewDidLayoutSubviews() {
              super.viewDidLayoutSubviews()
          }
      

      解决方案是添加条件,viewDidLayoutSubviews 内的函数只被调用 1 次。

      【讨论】:

        【解决方案4】:

        我遇到了与此类似的错误,但原因不同。我有一个按钮,它执行到另一个包含 TableView 的 ViewController 的转场,但看起来应用程序在执行转场时冻结。

        我的问题是,由于我的一个变量中有几个 didSet 观察者,我无限调用 reloadData()。一旦我将这个电话转移到其他地方,问题就解决了。

        【讨论】:

          【解决方案5】:

          启动您的应用并等待它冻结。然后按下 Xcode 中的“暂停”按钮。左窗格应显示当前正在运行的方法。

          【讨论】:

          • 这是解决这种“无错误”崩溃/锁定的最佳解决方案。
          • 暂停按钮是什么/在哪里?我没有看到一个
          • 最佳答案!在我的情况下,发生了一个 layoutSubviews 循环,点击调试器上的暂停按钮就是让我知道这一点的原因
          【解决方案6】:

          从发生冻结的地方设置一个断点并找出导致冻结的行。

          可能是,加载大数据,禁用控件,在主线程中重载,只需使用断点找出发生的位置并在此基础上进行纠正。

          【讨论】:

            【解决方案7】:

            一般来说,强烈建议在主线程上执行所有动画方法和界面操作,并放入后台任务,如从服务器下载数据等...

            dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
                //here everything you want to perform in background
            
                dispatch_async(dispatch_get_main_queue(), ^{ 
                    //call back to main queue to update user interface
                });
            });
            

            来源:http://www.raywenderlich.com/31166/25-ios-app-performance-tips-tricks

            【讨论】:

              猜你喜欢
              • 2012-04-29
              • 2015-12-15
              • 1970-01-01
              • 2012-06-25
              • 1970-01-01
              • 2011-12-21
              • 2011-03-17
              • 2013-09-11
              • 1970-01-01
              相关资源
              最近更新 更多