iOS 12.2: CMMotionManager блокирует основной поток - PullRequest
0 голосов
/ 11 апреля 2019

У меня проблема с CoreMotion и следующим кодом:

let motionManager = CMMotionManager()

Он блокирует мою Mainthread на 4-5 секунд, и я не знаю почему. Проблема появляется, когда я обновил свой iPhone XR до 12.2. Он не блокирует основной поток с iPhone 6S на 12.1.3.

Я думаю, что это может быть аппаратная проблема или версия iOS.

Спасибо

1 Ответ

0 голосов
/ 11 апреля 2019

CoreMotion многое делает сам во время инициализации.
Переместить инициализацию сделать другой поток.
Изменить:

Я могу подтвердить проблему с 12.2 на iPhone Xs разработки. Нет проблем на реально используемом устройстве. Я также вижу предупреждения о нарушении, сообщающие, что CoreMotion пытается получить доступ к Приложению состояний из фонового потока.

Однако перемещение init в отдельный поток исправляет любые зависания пользовательского интерфейса. Инициирование 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 у устройства dev проблем нет. Попробуйте запустить свой код без подключения к отладчику.

...