CoreLocation设计最佳实践以实现最小开销?

时间:2013-03-13 02:47:10

标签: iphone ios core-location cllocationmanager

我希望获取位置信息,但我不需要不断更新;有特定的和偶然的用户操作意味着需要获取最新值,因此我想“刷新”位置数据并获得当前值。

我希望在功耗等方面成为设备上最好的公民。我也只需要尽可能低的粒度(3km +)变化。

  • 我理解它的方式,即使我只想要“点样本”的位置,我仍然需要启动一个长期运行的变更监控过程(“重要位置变化”或非单元设备正常)。这是对的吗?
  • 当我想要当前位置时,假设此过程正在运行,我可以直接询问位置管理员,对吗? (而不是将最新的传递给委托方法。)
  • 如果是这样的话,大概在应用程序背景时将其关闭是合理的,并在预设时重启? (我不需要/想要从变化的背景中醒来。)
  • 偶尔获取数据的方法是否比保持位置管理器运行更少?
  • 我还缺少什么我应该做的事情?

欢迎您在此澄清。文档在最佳实践中并不是特别清楚。感谢。

2 个答案:

答案 0 :(得分:3)

有很多方法可以使用这个类。一个基本的方法是在你的app委托中初始化它,如下所示:

在app delegate中设置一个名为locmgr -

的属性
 @property (nonatomic,strong) CLLocationManager *locmgr;

也符合  应用程序委托的接口部分中的CLLocationManagerDelegate

然后在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];

然后添加委托回调

 - (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

 }

然后在背景时将其关闭

 - (void)applicationDidEnterBackground:(UIApplication *)application
 {
         [self.locmgr stopUpdatingLocation];
 }

我喜欢在app delegate foreground / background中打开和关闭服务。听起来您可能不太经常需要位置服务。也许应用程序委托中的一个方法来启动和停止它。请记住,虽然在开始更新位置服务之后可能需要一两秒钟,但在它具有准确值之前,这就是为什么有时候,最好将它打开并在需要时抓住它。如果正确设置过滤器,则不会产生额外的功耗。

我希望这有助于您在项目中使用它。

答案 1 :(得分:1)

如果您只想在“特定和偶然的用户操作”之后获取信息,则在这些操作发生时开始更新,并在使用startUpdatingLocation和stopUpdatingLocation获得所需数据时停止它们。在关闭监视之前,您应该检查数据的时间戳以确保它是最新的,您还可以查看数据的准确性,以确定是否要在停止之前等待更准确的数据。