CLLocationManager
кэширует ваше последнее местоположение и возвращает его, как только вы позвоните -startUpdatingLocation
. Итак, вы запускаете обновления, получаете старое местоположение и затем останавливаете обновления.
Это не так, как -startUpdatingLocation/-stopUpdatingLocation
предназначены для использования. Как я уже говорил выше, что не так с вызовом метода делегата несколько раз? Если вы хотите получить местоположение только тогда, когда пользователь нажимает кнопку, оставьте обновление CLLocationManager
и просто отметьте свойство CLLocationManger
location
, когда пользователь нажимает вашу кнопку.
Если причина, по которой вы пытаетесь избежать нескольких вызовов метода делегата, заключается в том, что вы беспокоитесь о потреблении энергии и т. Д., Измените свойство desiredAccuracy
CLLocationManager
на что-то вроде: locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters
.
В общем, это может выглядеть примерно так ...
.h файл:
@interface YourController : NSObject <CLLocationManagerDelegate>
@property (nonatomic, retain) CLLocationManager *locationMgr;
@property (nonatomic, retain) CLLocation *lastLocation;
- (IBAction)getNewLocation:(id)sender;
@end
.m файл:
@interface YourController
@synthesize locationMgr = _locationMgr;
@synthesize lastLocation = _lastLocation;
- (id)init
{
if (self = [super init]) {
self.locationMgr = [[CLLocationManager alloc] init];
self.locationMgr.desiredAccuracy = kCLLocationAccuracyBest;
self.locationMgr.delegate = self;
}
return self;
}
- (void)locationManager:(CLLocationManager *)manager
didUpdateToLocation:(CLLocation *)newLocation
fromLocation:(CLLocation *)oldLocation
{
if (!self.lastLocation) {
self.lastLocation = newLocation;
}
if (newLocation.coordinate.latitude != self.lastLocation.coordinate.latitude &&
newLocation.coordinate.longitude != self.lastLocation.coordinate.longitude) {
self.lastLocation = newLocation;
NSLog(@"New location: %f, %f",
self.lastLocation.coordinate.latitude,
self.lastLocation.coordinate.longitude);
[self.locationMgr stopUpdatingLocation];
}
}
- (IBAction)getNewLocation:(id)sender
{
[self.locationMgr startUpdatingLocation];
NSLog(@"Old location: %f, %f",
self.lastLocation.coordinate.latitude,
self.lastLocation.coordinate.longitude);
}
- (void)dealloc
{
[self.locationMgr release];
self.locationMgr = nil;
[self.lastLocation release];
self.lastLocation = nil;
[super dealloc];
}
@end