Проверка основного потока: UI API вызывается в фоновом потоке: - [UIApplication applicationState]

Я использую Google maps в Xcode 9 beta, iOS 11.

Я получаю сообщение об ошибке, выводимое в журнал следующим образом:

Main Thread Checker: UI API вызывается в фоновом потоке: - [UIApplication applicationState] PID: 4442, TID: 837820, название потока: com.гуглить.Карты.LabelingBehavior, имя очереди: com.яблоко.корень.по умолчанию-qos.так, например, функция QoS: 21

почему это происходит, поскольку я почти уверен, что не изменяю интерфейс элементы из основного потока в моем коде.

 override func viewDidLoad() {

    let locationManager = CLLocationManager()


    locationManager.requestAlwaysAuthorization()


    locationManager.requestWhenInUseAuthorization()

        if CLLocationManager.locationServicesEnabled() {

            locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters
            locationManager.startUpdatingLocation()
        }

      viewMap.delegate = self

     let camera = GMSCameraPosition.camera(withLatitude: 53.7931183329367, longitude: -1.53649874031544, zoom: 17.0)


        viewMap.animate(to: camera)


    }

    func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        let locValue:CLLocationCoordinate2D = manager.location!.coordinate
        print("locations = (locValue.latitude) (locValue.longitude)")
    }

    func mapView(_ mapView: GMSMapView, willMove gesture: Bool) {


    }

    func mapView(_ mapView: GMSMapView, idleAt position: GMSCameraPosition) {

        if(moving > 1){
            moving = 1
        UIView.animate(withDuration: 0.5, delay: 0, animations: {

            self.topBarConstraint.constant = self.topBarConstraint.constant + (self.topBar.bounds.height / 2)

            self.bottomHalfConstraint.constant = self.bottomHalfConstraint.constant + (self.topBar.bounds.height / 2)

            self.view.layoutIfNeeded()
        }, completion: nil)
    }
         moving = 1
    }


    // Camera change Position this methods will call every time
    func mapView(_ mapView: GMSMapView, didChange position: GMSCameraPosition) {
        moving = moving + 1
        if(moving == 2){


            UIView.animate(withDuration: 0.5, delay: 0, animations: {


                self.topBarConstraint.constant = self.topBarConstraint.constant - (self.topBar.bounds.height / 2)

                self.bottomHalfConstraint.constant = self.bottomHalfConstraint.constant - (self.topBar.bounds.height / 2)


                self.view.layoutIfNeeded()
            }, completion: nil)
        }
        DispatchQueue.main.async {

            print("Moving: (moving) Latitude: (self.viewMap.camera.target.latitude)")
            print("Moving: (moving)  Longitude: (self.viewMap.camera.target.longitude)")
        }
    }

6 ответов


мой ответ предполагает, что вы уже проверили, чтобы убедиться, что ваши коды не изменяя пользовательского интерфейса из фонового потока.

Xcode 9, 10.29.17

  1. обновите свои стручки. Многие разработчики Cocoapod догоняют позднюю проверку потоков.
  2. если разработчик cocoa pod не обновляет свой стручок, вы можете попробовать связаться с ними или предложить изменения.

Xcode 9 бета

Я заметил недавно встроенный сбой во время выполнения с Xcode 9 beta, которого нет с xcode 8. Это означает, что если включить проверку потоков, сбой присутствует, если отключить проверку потоков, сбой отсутствует. Если вы не хотите, чтобы ваша программа рухнула, вы можете вернуться к xcode 8 или отключить проверку потоков, пока Apple не удалит новый сбой или ваши стручки больше не вызовут его.


попытка обернуть все строки кода, которые изменяют пользовательский интерфейс в DispatchQueue.main.async {} строительство.


трудно найти код пользовательского интерфейса, который иногда не выполняется в основном потоке. Вы можете использовать трюк ниже, чтобы найти и исправить ее.

  1. выберите Редактировать схему - > Диагностика, отметьте Main Thread Checker и приостановите вопросы. enter image description here
  2. запустить приложение iOS, чтобы воспроизвести эту проблему. (Xcode должен сделать паузу на первом выпуске.) enter image description here

  3. оберните код, который изменяет пользовательский интерфейс в DispatchQueue.main.async {} enter image description here


смотрите по этой ссылке https://developer.apple.com/documentation/code_diagnostics/main_thread_checker

для меня это сработало, когда я позвонил из блока.


Если вы столкнулись с этой проблемой при запуске тестовой цели, снимите флажок "Main Thread Checker", как в образе: enter image description here


выберите scheme - > Diagnotics, удалите main thread checker, затем предупреждение исчезнет. редактор схемы