Подтвердить что ты не робот

Main Thread Checker: API пользовательского интерфейса, вызываемый в фоновом потоке: - [UIApplication applicationState]

Я использую карты Google в Xcode 9 beta, iOS 11.

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

Main Thread Checker: API пользовательского интерфейса, вызываемый в фоновом потоке: - [UIApplication applicationState] PID: 4442, TID: 837820, Название темы: com.google.Maps.LabelingBehavior, Имя очереди: com.apple.root.default-qos.overcommit, 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)")
        }
    }
4b9b3361

Ответ 1

Во-первых, убедитесь, что ваши вызовы карт Google и изменений пользовательского интерфейса вызываются из основного потока с помощью:

DispatchQueue.main.async {
    //Do UI Code here. 
    //Call Google maps methods.
}

Также обновите текущую версию карт Google. Карты Google должны были сделать пару обновлений для проверки потока.

На вопрос: "Почему это происходит?" Я думаю, что Apple добавила утверждение для крайнего случая, для которого Google затем пришлось обновить свой модуль.

Ответ 2

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

  1. Выберите "Редактировать схему" → "Диагностика", установите флажок "Проверка основного потока" и "Приостановить" при возникновении проблем. enter image description here
  2. Запустите приложение iOS, чтобы воспроизвести эту проблему. (Xcode должен остановиться на первой проблеме.) enter image description here

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

Ответ 3

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

Ответ 5

@unchartedworks

Я получил эту ошибку, Проверка основного потока: API пользовательского интерфейса вызван в фоновом потоке: - [UIApplication applicationState] PID: 2145, TID: 557528, Имя потока: (нет), Имя очереди: com.google.fira.worker, QoS: 9 Backtrace: 4 DownRoute 0x0000000102ca8120 FIRAIsAppActive + 56 5 DownRoute 0x0000000102ca75cc - [FIRASessionReporter shouldStartNewSession] + 24 6 DownRoute 0x0000000102ca7170 - [FIRASessionReporter initWithPersistedConfig:] + 284 7 DownRoute 0x0000000102c92e58 __48- [FIRAMeasurement startMeasurementOnWorkerQueue] _block_invoke + 1828 8 libdispatch.dylib 0x00000001048e0dc8 _dispatch_client_callout + 16 9 libdispatch.dylib 0x00000001048e2e28 _dispatch_once_callout + 84 10 DownRoute 0x0000000102c92718 - [FIRAMeasurement startMeasurementOnWorkerQueue] + 268 11 DownRoute 0x0000000102c924e4 - [FIRAMeasurement setEnabledOnWorkerQueue:] + 124 12 DownRoute 0x0000000102ca6de8 __52- [FIRAScheduler scheduleOnWorkerQueueBlockID: блок:] _ block_invoke + 44 13 libdispatch.dylib 0x00000001048df824 _dispatch_call _block_and_release + 24 14 libdispatch.dylib 0x00000001048e0dc8 _dispatch_client_callout + 16 15 libdispatch.dylib 0x00000001048e8e6c _dispatch_lane_serial_drain + 720 16 libdispatch.dylib 0x00000001048e9b60 _dispatch_lane_invoke + 460 17 libdispatch.dylib 0x00000001048f3bfc _dispatch_workloop_worker_thread + 1220 18 libsystem_pthread.dylib 0x00000001e6aad0dc _pthread_wqthread + 312 19 libsystem_pthread.dylib 0x00000001e6aafcec start_wqthread + 4

→ Я сделал то же самое, но я получил ошибку ниже, вы можете мне помочь

libMainThreadChecker.dylib '__ main_thread_checker_on_report: → 0x1032bd484 <+0>: ret

Ответ 7

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

Ответ 8

Выберите схему → Диагностика, удалите проверку основного потока, затем предупреждение исчезнет. редактор схем