Предупреждение Main Thread Checker с CoreMotion, появляется только на iPhone модели 2018 года - PullRequest
0 голосов
/ 09 февраля 2019

Чрезвычайно упрощенная версия проблемы:

import UIKit
import CoreMotion

class ViewController: UIViewController {
    private let manager = CMMotionManager()
    private let interval = 0.01

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        startUpdates()
    }

    private func startUpdates() {
        let queue = OperationQueue()
        queue.name = "com.demo.motion"
        queue.qualityOfService = .userInteractive
        queue.maxConcurrentOperationCount = 1
        manager.accelerometerUpdateInterval = interval
        manager.startAccelerometerUpdates(to: queue) { _, _ in }
    }
}

Когда я запускаю это на iPhone XR, я получаю следующее:

Проверка основного потока: API пользовательского интерфейса вызывается в фоновом потоке: - [UIApplication applicationState] PID: 1237, TID: 147763, имя потока: com.apple.CoreMotion.MotionThread, имя очереди: com.apple.root.default-qos.overcommit, QoS:0

  • Мое устройство работает 12.3 , которое в настоящее время является последней версией iOS
  • Запуск этого на различных iPad (до 2018 года), iPhone 8, iPhone 6S и другие старые модели, проблема не появляется.
  • Изменение qualityOfService не влияет на это (я предпочитаю использовать utility)
  • Из любопытстваЯ обернул всю функцию startUpdates() вокруг основной отправки безуспешно

Основываясь на имени очереди, и когда это происходит, я предполагаю, что это что-то внутреннее, что просто раскрываетсячем быстрее процессор в XR, по сравнению со старыми устройствами.

1 Ответ

0 голосов
/ 09 февраля 2019

Это известная проблема, о которой было сообщено Apple с радаром, связанным здесь .

Надеюсь, она будет исправлена ​​в ближайшее время, но я не вижу записей для нее в SOи хотел иметь что-то доступное для других, кто сталкивался с этим.

Если вы можете, пожалуйста, подайте дупе*.

...