views:

20

answers:

1

I need to track user current location with realtime refreshrate I have one function with two solutions for that.

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

ifdef Variant_1

if(m_currentLocation)
    [m_Map removeAnnotation:m_currentLocation];
else
    m_currentLocation = [MKPlacemark alloc];
[m_currentLocation initWithCoordinate:newLocation.coordinate addressDictionary:nil];
[m_Map addAnnotation:m_currentLocation];
[m_Map setCenterCoordinate:m_currentLocation.coordinate animated:YES];

else //Variant_2

if(m_currentLocation == nil)
 {
 m_currentLocation = [MKPlacemark alloc];
 [m_currentLocation initWithCoordinate:newLocation.coordinate addressDictionary:nil];
 [m_Map addAnnotation:m_currentLocation];

 }else
 {
 [m_currentLocation initWithCoordinate:newLocation.coordinate addressDictionary:nil];
 //[m_currentLocation setCoordinate:newLocation.coordinate];
 }
[m_Map setCenterCoordinate:m_currentLocation.coordinate animated:YES];

endif

}

Variant_1 works good but when you move fast the location sing on the map blinks. Variant_2 does not blink but does not move location sing however moves map. Where is the problem? Thant you.

A: 

In Variant_1, it probably blinks because you're doing a removeAnnotation and then an addAnnotation instead of just modifying the coordinates of the existing annotation.

In Variant_2, initWithCoordinate returns a new MKPlacemark object with those coordinates. It doesn't update the properties of the object you are calling the method on.

What happens if you run the setCoordinate line instead?

A separate question is why not use the MKMapView's built-in ability to show the current user location? Just do m_Map.showsUserLocation = YES; at the start. You don't need CLLocationManager to get the user's current location if you are using the MKMapView anyway.

I think you'll still need to center the map on the user's current location using one of the map view delegate methods:

- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation
{
    [mapView setCenterCoordinate:userLocation.location.coordinate animated:YES];
}
aBitObvious