web-dev-qa-db-fra.com

Vérificateur de thread principal: API d'interface utilisateur appelée sur un thread d'arrière-plan: - [UIApplication applicationState]

J'utilise Google Maps dans Xcode 9 beta, iOS 11.

Une erreur est générée dans le journal comme suit:

Vérificateur de thread principal: API d'interface utilisateur appelée sur un thread d'arrière-plan: - [UIApplication applicationState] PID: 4442, TID: 837820, Nom du thread: com.google.Maps.LabelingBehavior, Nom de la file d'attente: com.Apple.root.default-qos.overcommit , QoS: 21

Pourquoi cela se produit-il alors que je suis presque certain que je ne modifie aucun élément d'interface du thread principal de mon code.

 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)")
        }
    }
89
MattBlack

Tout d'abord, assurez-vous que vos invocations de Google Maps et les modifications de l'interface utilisateur sont appelées à partir du fil principal à l'aide de:

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

Mettez également à jour votre version actuelle de Google Maps. Google maps a dû effectuer quelques mises à jour pour le vérificateur de threads.

Pour la question: "Pourquoi cela se produirait-il?" Je pense que Apple a ajouté un assertion à une affaire Edge pour laquelle Google devait ensuite mettre à jour son pod.

17
ScottyBlades

Il est difficile de trouver le code d'interface utilisateur qui n'est parfois pas exécuté dans le thread principal. Vous pouvez utiliser le truc ci-dessous pour le localiser et le réparer.

  1. Choisissez Éditer le schéma -> Diagnostics, cochez le Vérificateur de thread principal et Suspendez le problème. enter image description here
  2. Exécutez votre application iOS pour reproduire ce problème. (Xcode devrait faire une pause sur le premier problème.) enter image description here

  3. Enveloppez le code qui modifie l'interface utilisateur dans DispatchQueue.main.async {}enter image description here

127
UnchartedWorks

Entourez les lignes de code qui modifient l'interface utilisateur dans DispatchQueue.main.async {} afin de vous assurer qu'elles s'exécutent sur le thread principal. Sinon, vous pouvez les appeler à partir d'un thread en arrière-plan, où les modifications de l'interface utilisateur ne sont pas autorisées. Toutes ces lignes de code doivent être exécutées à partir du thread principal.

46

Reportez-vous à ce lien https://developer.Apple.com/documentation/code_diagnostics/main_thread_checker

Pour moi cela a fonctionné quand j'ai appelé du bloc.

Je pense que la solution est déjà donnée, pour mon problème est le clavier sur le chemin.

IKeyboardTaskQueue ne peut être appelé qu'à partir du thread principal

0
gamal