2011-09-05 2 views
0

J'ai un MKMapView par lequel je laisse tomber une annotation chaque fois que la vue se charge, ou quand la méthode de classe personnalisée showLocation est appelée.Problèmes étranges de CLLocationManager

J'ai besoin de précision pour être le meilleur

-(void)viewDidLoad { 
    locationManager = [[CLLocationManager alloc] init]; 
    locationManager.delegate = self; 
    locationManager.distanceFilter = kCLDistanceFilterNone; 
    locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation; 
    [locationManager startUpdatingLocation]; 
} 
-(IBAction) showLocation:(id) sender{ 
    [locationManager startUpdatingLocation]; 
} 
- (void) locationManager:(CLLocationManager *) manager 
    didUpdateToLocation:(CLLocation *) newLocation 
      fromLocation:(CLLocation *) oldLocation { 
// start geocoding with newLocation coordinate which will automatically set annotation. 
SVGeocoder *geocodeRequest = [[SVGeocoder alloc] 
             initWithCoordinate:CLLocationCoordinate2DMake(newLocation.coordinate.latitude, newLocation.coordinate.longitude)]; 
     [geocodeRequest setDelegate:self]; 
     [geocodeRequest startAsynchronous]; 
     [geocodeRequest release]; 
      [locationManager stopUpdatingLocation]; 
} 

Ma question est de savoir quand la méthode didUpdateToLocation appelée? Seulement après qu'un nouvel emplacement soit trouvé lorsque j'effectue [locationManager startUpdatingLocation]?

Je suis confronté à un problème étrange lorsque l'utilisateur est en déplacement et à l'arrêt. Dites que l'utilisateur se déplace du point A-> B-> C-> D avec des intervalles de 1 min entre les points. Quand j'appelle ma méthode au point C, parfois elle renvoie les coordonnées du point A, parfois le point B et parfois le C. C'est juste aléatoire.

C'est encore plus bizarre quand je suis à l'arrêt. Je reçois des coordonnées différentes quand j'appelle la méthode showLocation même si je suis branché sur ma maison WiFi.

Je pensais à implémenter didUpdateToLocation pour obtenir le meilleur résultat possible en 5 secondes. Si dans les 5secs, il trouve un emplacement particulier d'une précision que j'avais définie, alors utilisez la coordonnée. Sinon, utilisez le meilleur qu'il a trouvé dans le délai de 5sec. Mais comme je suis nouveau, je ne sais pas comment coder quelque chose comme ça. J'ai lu NSTimer et il semble que cela pourrait fonctionner.

Des conseils, les gars?

Merci beaucoup d'avance!

Répondre

1

L'une des raisons pour lesquelles vous recevez l'emplacement à partir du point A est que CoreLocation renvoie le dernier emplacement valide qu'il avait en premier jusqu'à ce qu'il puisse obtenir un emplacement plus précis. Lorsque vous appelez le [locationManager startUpdatingLocation];, le code -didUpdateToLocation s'affiche à plusieurs reprises jusqu'à ce que vous soyez satisfait et appelez le -stopUpdatingLocation.

Je pense que vous avez juste besoin d'accorder un peu de temps pour obtenir un meilleur emplacement avant d'arrêter la mise à jour. Je considérerais déplacer l'emplacement de mise à jour d'arrêt de votre -didUpdateToLocation à une méthode différente.

0

Supprimer [locationManager stopUpdatingLocation]; de votre code et essayez.

Questions connexes