J'utilise Google Maps dans Xcode 9 beta, iOS 11.
Je reçois une erreur 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 de thread: com.google.Maps.LabelingBehavior, nom de file d'attente: com.apple.root.default-qos.overcommit , QoS: 21
Pourquoi cela se produirait-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)")
}
}
swift
google-maps
xcode9-beta
Noir mat
la source
la source
mapView(_:didChange)
vous distribuez lesprint
instructions à la file d'attente principale. N'êtes-vous pas déjà dans la file d'attente principale? Sinon, vous devez également envoyer l'animate
appel vers la file d'attente principale. Je suggérerais d'en insérer quelques-unesdispatchPrecondition(condition: .onQueue(.main))
avant ces mises à jour de l'interface utilisateur, juste pour être sûr.Réponses:
Tout d'abord, assurez-vous que vos appels de google maps et de modifications de l'interface utilisateur sont appelés à partir du fil de discussion principal.
Vous pouvez activer Thread Sanitizer pour trouver les lignes incriminées.
Vous pouvez mettre des lignes offensantes sur le fil principal avec les éléments suivants:
Mettez également à jour votre version actuelle de google maps. Google Maps a dû faire quelques mises à jour pour le vérificateur de fil.
Pour la question: "Pourquoi cela se produirait-il?" Je pense qu'Apple a ajouté une assertion pour un cas de pointe pour lequel Google a ensuite dû mettre à jour son pod.
la source
Il est parfois difficile de trouver le code d'interface utilisateur qui n'est pas exécuté dans le thread principal. Vous pouvez utiliser l'astuce ci-dessous pour le localiser et le réparer.
Choisissez Edit Scheme -> Diagnostics, cochez Main Thread Checker.
Xcode 11.4.1
Cliquez sur la petite flèche en regard du vérificateur de thread principal pour créer un point d'arrêt du vérificateur de thread principal.
Xcode précédent
Cochez Pause sur les problèmes.
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 {}
la source
"com.apple.CoreMotion.MotionThread(23)"
, puis je vérifie également tous les autres threads. DansThread 1
quelque chose a attiré mon attention: c'est SVProgressHUD (une bibliothèque de vue de progression que j'ai utilisée). Donc, je sais que c'est un appel àSVProgressHUD.show()
quelque part dans le contrôleur de vue cible. Ensuite, enveloppez chaque apparition avecDispatchQueue.main.async
ou commentez simplement, testez à nouveau et j'ai découvert laquelle est problématique.Enveloppez les lignes de code qui modifient l'interface utilisateur
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 d'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.la source
DispatchQueue.main.async {}
Reportez-vous à ce lien https://developer.apple.com/documentation/code_diagnostics/main_thread_checker
Pour moi, cela a fonctionné lorsque j'ai appelé du bloc.
la source
Je pense que la solution est déjà donnée, car mon problème est le clavier en route.
UIKeyboardTaskQueue ne peut être appelé qu'à partir du thread principal
la source
Choisissez schéma -> Diagnostics, supprimez le vérificateur de thread principal, puis l'avertissement disparaîtra. éditeur de schéma
la source