Q:

CoreLocation design best practice for minimum overhead?

I am looking to grab location information, but I don't need continual updates; there are specific and occasional user actions that imply a need to pick up the latest value, so I want to "refresh" the location data and get whatever the current value is.
I want to be the best possible citizen on the device in terms of power usage, etc. I also only need the lowest possible granularity (3km+) changes.

The way I understand it, I still need to start a long-running change monitoring process (either for "significant location changes" or normal for non-cell devices) even if I only want "point samples" of location. Is this correct?
When I want the current location, assuming this process is running, I can ask the location manager directly, correct? (Rather than stashing the latest passed into the delegate method.)
If so, presumably, it's reasonable to shut this down when the app is backgrounded, and restart when foregrounded? (I don't need/want to be woken up from background on changes.)
Is there any less intrusive way of getting the data occasionally than keeping the location manager running?
Is there anything else I'm missing that I should be doing?

Your clarifications here are welcome. The documentation isn't especially clear on best practices. Thanks.

A:

there are many ways to use this class. A basic approach would be to initialize it in your app delegate like so:
set a property called in app delegate called locmgr - 
 @property (nonatomic,strong) CLLocationManager *locmgr;

also conform to the
 CLLocationManagerDelegate in the interface section of the app delegate
then initialize it in applicationDidFinish ....
self.locmgr = [[CLLocationManager alloc] init];
self.locmgr.delegate = self;
self.locmgr.distanceFilter = 1500.0f;  //only update when location changes this much
self.locmgr.desiredAccuracy = kCLLocationAccuracyThreeKilometers; //change for better accuracy
[self.locmgr setPurpose:@"this app needs location services"];
[self.locmgr startUpdatingLocation];

then add the delegate call back
 - (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation      *)newLocation fromLocation:(CLLocation *)oldLocation {
    NSLog(@"location updated to new location:%@",newLocation);
    //put your logic - maybe save it to a property and reference it when needed

 }

then turn it off when backgrounded
 - (void)applicationDidEnterBackground:(UIApplication *)application
 {
         [self.locmgr stopUpdatingLocation];
 }

I like to turn the service on and off in the app delegate foreground/background.  It sounds like you may need the location services less often.  Perhaps a method in the app delegate to start and stop it.  Remember though it may take a second or two after you start updating location services, before it has an accurate value so that is why sometimes, it's better to have it on and grab it when needed.  If you set the filters correctly, you will not cause much extra power consumption.
I hope that helps and is something you can use in your project.

