2017-03-17 2 views
1

Ce que j'ai construit:LocationManager expédition file d'attente Problème

J'ai construit un GMSMapView simple avec CLLocationManagerDelegate qui suit simplement l'emplacement actuel des utilisateurs et mise à jour sur GMSMapView.

Problème:

Lorsque le CLLocationManagerDelegate (l'écran GMSMapView) ouvre directement cela fonctionne très bien, mais lorsque je tente d'accéder à l'écran en utilisant un GMSMapViewsegue il pousse une erreur.

Un gestionnaire de position (0x145e5f9e0) a été créé dans une file d'attente d'exécution s'exécutant sur un thread autre que le thread principal. Il est de la responsabilité du développeur de s'assurer qu'une boucle d'exécution s'exécute sur le thread sur lequel l'objet du gestionnaire d'emplacement est alloué. En particulier, la création de gestionnaires d'emplacements dans des files d'attente de répartition arbitraires (non attachées à la file d'attente principale) n'est pas prise en charge et entraînera la non-réception des rappels.

Répondre

2

utilisant Swift 3. Donc, le problème était avec l'initialisation des variables GMSMapView et CLLocationManager. Voici comment cela a fonctionné pour moi:

I définit les variables dans la classe ViewController comme ci-dessous

private var locationManager: CLLocationManager! 
private var googleMapView: GMSMapView! 

Et dans le viewDidLoad() j'introduit un DispatchQueue de l'exécuter dans thread principal.

DispatchQueue.main.async { 
     //adding mapView 
     self.googleMapView = GMSMapView() 
     self.view.addSubview(self.googleMapView) 
     self.googleMapView.translatesAutoresizingMaskIntoConstraints = false 
     //auto layout constraints 
     self.googleMapView.topAnchor.constraint(equalTo: self.view.topAnchor, constant: 0).isActive = true 
     self.googleMapView.rightAnchor.constraint(equalTo: self.view.rightAnchor, constant: 0).isActive = true 
     self.googleMapView.leftAnchor.constraint(equalTo: self.view.leftAnchor, constant: 0).isActive = true 
     self.googleMapView.bottomAnchor.constraint(equalTo: self.view.bottomAnchor, constant: 0).isActive = true 
     //location manager setup 
     self.locationManager = CLLocationManager() 
     self.locationManager.delegate = self 
     self.locationManager.startUpdatingHeading() 
    } 
0

Vous devez placer votre code pour trouver l'emplacement dans la file d'attente d'expédition au lieu de la file d'attente principale.

+0

@John Welliem .... s'il vous plaît consulter ce lien https://www.3pillarglobal.com/insights/blocks-ios-introduction-to-grand-central-dispatch –

+0

s'il vous plaît consulter également cette https : //www.appcoda.com/ios-concurrency/ –

+0

Une réponse un peu plus spécifique serait très appréciée. –

1

Utilisez ce code

DispatchQueue.main.async 
{ 
    /*your code here*/ 
}; 
+0

J'ai littéralement enlevé tout le code de ViewController seulement l'instance 'GMSMapView' est là et toujours la même erreur et n'a plus de code à ajouter dans' DispatchQueue'. –

+0

GMSMapView make dans ce code –

+0

Même erreur! On dirait que quelque chose ne va pas avec l'implémentation 'GMSMapView'. –