简体   繁体   中英

Getting the current location only after the second time startUpdatingLocation is called

{
...
locationManager = [[CLLocationManager alloc] init];
    locationManager.delegate = self;
    locationManager.desiredAccuracy = kCLLocationAccuracyBest;
}

-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations {

        NSLog(@"myLocation1: %@",[locations lastObject]);
        myLocation = [locations lastObject];
        NSLog(@"myLocation2: %@",[locations lastObject]);
        [manager stopUpdatingLocation];

        [self doSomethingWithLocation];    
}

Currently I'm in the location 40.000,40.000. I'm closing my app and change location to 10.000,10.000

When entering the app again and running [locationManager startUpdatingLocation]; my log will show:

myLocation1: <+40.00000000,+40.00000000>
myLocation2: <+40.00000000,+40.00000000>

If I'll trigger [locationManager startUpdatingLocation]; again my log will show:

myLocation1: <+10.00000000,+10.00000000>
myLocation2: <+10.00000000,+10.00000000>

How can I call didUpdateLocations once and still get the current location? Should I use another delegate?

I guess I could place stopUpdatingLocation inside doSomethingWithLocation and run doSomethingWithLocation after some sort of delay in order for the right location to be updated but I'm sure that's not the way it's meant to be.

Thanks

Leave the location manager running for a while (eg 30 seconds), setting a timer to tell it to stop. The location manager updates are like pancakes, the first one you get isn't always the best.

The first update you are seeing is likely a "stale" location, which was determined many minutes ago when location services were last powered up. Or it may be a very inaccurate location determined using cell-tower positioning, for example. If you just need to get the device's current location, using Core Location directly requires a good deal of code because you must handle these cases. (The CLLocationManager API appears to be built for apps that need continuous location updates, like turn-by-turn GPS navigation apps.)

Instead of using CLLocationManager directly, I suggest you take a look at using an open source component such as INTULocationManager which will handle all of this work for you and make it trivially simple to request one or more discrete requests for the device's current location.

In this case you should check timestamp of location. User does not move on such distances so quickly.

-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations {

        CLLocation *location = [locations lastObject];
        if(fabs([location.timestamp timeIntervalSinceNow]) < 5)//seconds
        {
            myLocation = location;
            manager.delegate = nil;
            [manager stopUpdatingLocation];
            [self doSomethingWithLocation];
        }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM