【问题标题】:Location Manager stopMonitoringForRegion Not Working位置管理器 stopMonitoringForRegion 不工作
【发布时间】:2014-03-03 18:08:03
【问题描述】:

我正在开发的一个应用程序在后台运行时使用用户的当前位置设置区域监控。当应用程序再次激活时,我试图停止对该区域的监控,但它似乎在大多数情况下间歇性地工作,导致它无法按预期运行。当应用程序在后台运行时,我开始监视该区域,当我记录详细信息时它工作正常:

- (void)locationManager:(CLLocationManager *)manager didStartMonitoringForRegion:(CLRegion *)region {
    DDLogInfo(@"CREATED REGION: %@", region.identifier);
}

这会导致以下日志:

  • “创建区域:regionFor:[此处为实纬度,此处为实经度],半径:100”

当应用唤醒时,我调用以下函数:

- (void)stopMonitoringAllRegions {
    DDLogInfo(@"About to stop monitoring for %d regions", [locationManager monitoredRegions].count);

    // stop monitoring for any and all current regions
    for (CLRegion *region in [[locationManager monitoredRegions] allObjects]) {
        [locationManager stopMonitoringForRegion:region];
    }

    DDLogInfo(@"After stopping, we're currently monitoring for %d regions", [locationManager monitoredRegions].count);
} 

这导致大约 75% 的时间出现以下日志:

  • “即将停止对 1 个区域的监控”
  • “停止后,我们目前正在监控 1 个区域”

而且我很少得到看似成功的东西:

  • “即将停止对 1 个区域的监控”
  • “停止后,我们目前正在监控 0 个区域”

我尝试了几件事,但都没有成功。我正在创建的区域是 CLCircularRegions,它继承自 CLRegion,因此无论如何都应该可以工作,但是在 for 循环中,我已将 CLRegion 更改为 CLCircularRegion,但没有任何效果。我最初使用 [locationManager monitorRegions] 本身,它返回一个 NSSet,所以我认为使用 allObjects 函数来获取数组可以解决问题,但它没有。

我还认为在枚举时改变数组可能是一个问题,但是我在 SO 上看到的唯一其他帖子说上面对他们有用...

我错过了什么吗?

【问题讨论】:

  • 在我以前的应用程序上工作时,我遇到了同样的问题。显然 locationManager 不会立即清除受监控的区域。 [self performSelector:@selector(someMethod) withObject:nil afterDelay:0.1]; // someMethod -> 打印监控区域计数的虚拟方法。

标签: ios ios7 core-location cllocationmanager clregion


【解决方案1】:

如果您阅读monitoredRegions,它代表所有 CLLocationManager 实例的所有受监控区域,因此可能由私有调度队列控制 - 这可以解释延迟。

我的建议是保留您自己的可变数组(或集合),使用它来跟踪哪些区域受到监控,哪些区域不受监控,并且不依赖于该集合的位置管理器。

现在很明显,您不能依赖立即对其进行更改,我会围绕它进行设计,而不是尝试找到一些(今天)似乎有效但以后会咬你的启发式方法。

【讨论】:

  • 有趣。我的应用程序一次只需要监控一个区域,所以我感兴趣的只是停止监控旧区域,然后开始监控新区域。我认为我看到的问题实际上只是与想要记录所有详细信息有关的问题 - 我认为我的实现可能会按预期工作 - 现在进行测试。
  • @Mike 同意,这更像是一个表面问题。但是,如果您无意中改变了某些东西,您可能会遇到麻烦。我正在玩信标,并且有一个错误,我要求位置管理器启动两次监控 - 这破坏了一切!它仍然显示该区域正在管理,但从那时起就没有发生任何事情。
  • 如果在我的didExitRegion 中我不执行manager.stopMonitoringForRegion(region),我是否会在每次检查我的位置时都进行无数次回调?
  • @Honey 向主线程分派一个块以停止监视。可能需要设置一个已经完成的标志,然后忽略任何其他didExitRegions
猜你喜欢
  • 1970-01-01
  • 2021-05-13
  • 2013-01-01
  • 2013-07-30
  • 1970-01-01
  • 1970-01-01
  • 2015-04-25
  • 2019-05-03
  • 1970-01-01
相关资源
最近更新 更多