Предупреждение Main Thread Checker с CoreMotion, появляется только на iPhone модели 2018 года

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

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

 Новый ответ при использовании iOS 13

Я только что проверил это на недавно выпущенной версии iOS 13 (17A577) на устройстве 2018 года, и она больше не вызывает ошибку потоков.

 Предыдущий ответ при использовании iOS 12

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