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)")
}
}
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.
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.
Exécutez votre application iOS pour reproduire ce problème. (Xcode devrait faire une pause sur le premier problème.)
Enveloppez le code qui modifie l'interface utilisateur dans DispatchQueue.main.async {}
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.
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