【问题标题】:iOS 12.2 : CMMotionManager is blocking the main threadiOS 12.2:CMMotionManager 阻塞了主线程
【发布时间】:2019-09-01 21:46:18
【问题描述】:

我对@9​​87654323@ 和以下代码有疑问:

let motionManager = CMMotionManager()

它阻塞了我的主线程 4-5 秒,我不知道为什么。当我将 iPhone XR 更新到 12.2 时出现问题。它不会在 12.1.3 上使用 iPhone 6S 阻塞主线程。

我认为这可能是硬件问题或 iOS 版本。

谢谢

【问题讨论】:

  • 我认为 iOS 12.2 上的 iPhone XR 没有问题...您确定这是阻塞主线程的代码的实际部分吗?
  • @holex 是的,当我评论该行时,它不会冻结。你使用的是 xcode 10.2 吗?
  • 我和那条线在装有 iOS 12.2 的 iPhone XR 上几乎不会阻塞任何东西——它可能是你代码中的其他东西导致了你的问题。
  • 我从雷达中找到了一些链接,这与我遇到的问题相同:https://openradar.appspot.com/46210367https://openradar.appspot.com/45003816 只有在我的手机处于调试模式时才会阻塞。

标签: ios swift core-motion ios12 cmmotionmanager


【解决方案1】:

CoreMotion 在初始化期间自己做了很多事情。
移动初始化做一个不同的线程。
编辑:

我可以在开发 iPhone Xs 上确认 12.2 的问题。在真实使用的设备上没有问题。我还看到了违规警告,告诉 CoreMotion 尝试从后台线程访问 Applicationstate。

但是,将 init 移动到单独的线程可以修复任何 UI 挂起的问题。 coremotion 的初始化仍然需要一段时间。我创建了一个空的单视图应用程序项目并更改了 ViewController 类

class ViewController: UIViewController {

    var motionManager: CMMotionManager?

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        view.backgroundColor = UIColor.red
        DispatchQueue.global().async {
            self.motionManager = CMMotionManager()
            DispatchQueue.main.async {
                self.view.backgroundColor = UIColor.green
            }
        }
        view.backgroundColor = UIColor.yellow
    }

}

没有单独的线程,红色仍然存在。使用单独的线程时,颜色在 dev XS 上是即时黄色,最后是绿色,在我的 iPhone 8Plus 上是即时绿色。

补充:
有趣的是,在没有附加 XCode 的情况下,开发设备没有任何问题。 尝试在不连接到调试器的情况下运行您的代码。

【讨论】:

  • 感谢您的回答@Helge,但似乎即使在线程中,CMMotionManager() 的初始化也是在 mainThread 中执行的。
  • 我可以重现这个问题,但线程在这里有帮助。你能用我最近的编辑来验证你的结果吗?
  • 是的,这个问题只在调试模式下出现。请参阅我原来的帖子中的 cmets,这个问题有两个雷达。再次感谢您的确认
猜你喜欢
  • 1970-01-01
  • 2017-12-24
  • 2019-07-01
  • 2020-01-02
  • 2018-02-16
  • 1970-01-01
  • 2015-12-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多