2017-01-27 2 views
1

Si je crée une instance de CLLocationManager uniquement sur UIThread, l'événement LocationUpdated sera déclenché. Pourquoi cela se produit-il? Il n'y a aucune trace dans la documentation Xamarin et Apple que CLLocationManager doit être created sur UIThread.Pourquoi CLLocationManager ne fournit-il pas d'événements à gérer?

Un code demande locationManager.RequestWhenInUseAuthorization(); NSLocationWhenInUseUsageDescription est setted dans Info.plist

private void CreateLocationManagerWorkingOption() { 
    ExecuteOnMainThread (() => { 
     locationManager = new CLLocationManager(); 
    }); 
    locationManager.LocationsUpdated += (object sender, CLLocationsUpdatedEventArgs e) => { 
     OnLocationChanged (locationManager,e.Locations [e.Locations.Length - 1]); 
    }; 
} 

private void CreateLocationManagerNotWorkingOption() { 
    ExecuteOnSomeThread(()=> { 
     locationManager = new CLLocationManager(); 
    }); 
    locationManager.LocationsUpdated += (object sender, CLLocationsUpdatedEventArgs e) => { 
     OnLocationChanged (locationManager,e.Locations [e.Locations.Length - 1]); 
    }; 
} 

private void StartTrackingImpl() { 
    ExecuteOnMainThread (() => locationManager?.StartUpdatingLocation()); 
} 

Répondre

0

Vous pouvez créer et gérer de chaque thread qui a une boucle d'exécution active.

De l'CLLocationManagerDelegate documentation:

Les méthodes de votre objet délégué sont appelés à partir du fil dans lequel vous avez commencé les services de localisation correspondants. Ce thread doit lui-même avoir une boucle d'exécution active, comme celle trouvée dans le thread principal de votre application.

+0

Cela influe uniquement sur StartUpdatingLocation et d'autres méthodes de mise à jour. Il n'y a pas d'informations sur le constructeur. De plus, j'ai parlé de la documentation de Xamarin, car mono peut affecter CLLoationManager. – Alexander