Ответ 1
Новый ответ при использовании iOS 13
Я только что проверил это на недавно выпущенной версии iOS 13 (17A577) на устройстве 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
qualityOfService
не влияет на это (я предпочитаю использовать utility
)startUpdates()
вокруг основной отправки, но безуспешноИсходя из имени очереди и того, когда это происходит, я предполагаю, что это нечто внутреннее, что просто раскрывается более быстрым процессором в XR по сравнению со старыми устройствами.
Я только что проверил это на недавно выпущенной версии iOS 13 (17A577) на устройстве 2018 года, и она больше не вызывает ошибку потоков.