Ниже приведена чрезвычайно упрощенная версия проблемы:
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 по сравнению со старыми устройствами.