MapKit - didUpdateToLocation вызван, но userLocation не обновлен - PullRequest
2 голосов
/ 24 марта 2011

У меня MKMapView настроен так:

mapView = [[MKMapView alloc] init];     
[mapView setMapType:MKMapTypeStandard];
[mapView setShowsUserLocation:YES];
[mapView setDelegate:self];

Затем я инициализирую CLLocationManager и вызываю startUpdatingLocation.

Я использую iSimulate для отправки данных GPSс моего телефона на симулятор, который, кажется, работает, так как метод делегата CLLocationManager вызывается с моими правильными GPS-координатами.Однако MKMapView никогда не перемещает синюю точку от Купертино.

- (void)locationManager:(CLLocationManager *)manager 
    didUpdateToLocation:(CLLocation *)newLocation 
           fromLocation:(CLLocation *)oldLocation {

NSLog(@"Did Update Location = %f / %f", [newLocation coordinate].latitude, [newLocation coordinate].longitude);

NSLog(@"Current User Location = %f / %f", [[mapView userLocation] coordinate].latitude, [[mapView userLocation] coordinate].longitude);

}

Вышеприведенный метод выдает следующее:

>>> Did Update Location = 40.740100 / -73.989900 # Correct
>>> Current User Location = 37.331693 / -122.030457 # Cupertino... Incorrect

Даже если я вручную обновляю координату userLocation, используя:

[[mapView userLocation] setCoordinate:[newLocation coordinate]];

Точка все еще сидит на Купертино.Я что-то упустил?

Ответы [ 2 ]

2 голосов
/ 31 марта 2011

Проблема с CLLocation Manger заключается в том, что он кэширует старое местоположение и через некоторое время возвращает старое местоположение.Чтобы получить новое местоположение, просто проверьте отметку времени объекта CLLocation, если он старше, чем ограничение по времени, а затем проигнорируйте это местоположение

-(void) locationManager:(CLLocationManager*)manager
    didUpdateToLocation:(CLLocation*)newLocation
    fromLocation:(CLLocation*) oldLocation
{
    NSDate* time = newLocation.timestamp;
    NSTimeInterval timePeriod = [time timeIntervalSinceNow];
    if(timePeriod < 2.0 ) { //usually it take less than 0.5 sec to get a new location but you can use any value greater than 0.5 but i recommend 1.0 or 2.0
        [manager stopUpdatingLocation];
        // process the location
    } else {
        // skip the location
    }
}
0 голосов
/ 06 декабря 2011

Точка все еще сидит на Купертино. Я что-то упустил?

Вы тестируете это на симуляторе? Обратите внимание, что в симуляторе точка местоположения всегда остается в Купертино. Попробуйте на устройстве - возможно, у вас совсем нет ошибки!

...