CLLocationManager 奇怪的行为

Posted

技术标签:

【中文标题】CLLocationManager 奇怪的行为【英文标题】:CLLocationManager strange behavior 【发布时间】:2012-04-02 19:29:35 【问题描述】:

我正在使用位置管理器来获取用户按下按钮时的位置。

我只需要那个确切的时间位置,所以我在获得位置后关闭更新。

如果我第一次得到 id 0 lat 0 lng 的位置。

-(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation 
    lat = newLocation.coordinate.latitude;
    lng = newLocation.coordinate.longitude;
    [locationManager stopUpdatingLocation];
    NSLog(@"New Latlng: %f x %f", lat, lng);

当用户按下按钮时,我调用:[locationManager startUpdatingLocation];

然后我将位置发送到我的服务器 [self sendData]。但位置为零。 在我的 -sendData 方法中,我添加了一个 NSLog 来追踪发生了什么,我意识到我在 -locationManager:didUpdateToLocation 被调用之前将数据发送到服务器......

2012-04-02 16:06:24.225 MyApp[2892:707] ---- Data sent to server ----
2012-04-02 16:06:25.167 MyApp[2892:707] Nova Latlng: -23.003582 x -43.316311

我试过了,但也没有按预期工作:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^
    [locationManager startUpdatingLocation];
    dispatch_async(dispatch_get_main_queue(), ^
        [self sendData];
    );
);

如何让 [self sendData] 等到我正确填充了 lat 和 lng 变量?

【问题讨论】:

【参考方案1】:

为什么不在stopUpdatingLocation 之后立即拨打电话?

【讨论】:

代理仍然被调用至少 2 次。【参考方案2】:

输入这段代码

dispatch_async(dispatch_get_main_queue(), ^
    [self sendData];
);

didUpdateToLocation:之后

[locationManager stopUpdatingLocation];

应该这样做。位置管理器更新是异步进行的,因此您必须等到有东西要处理后才能尝试对数据进行任何处理。

【讨论】:

这样,sendData 方法被调用了 3 次……你知道为什么吗? 可能是 didUpdateToLocation: 在停止更新的代码行被调用一次之前被调用了很多次。向该方法添加一个静态布尔值,这样您就可以知道您是否发送了一次数据,并且仅在布尔为 NO 时发送。

以上是关于CLLocationManager 奇怪的行为的主要内容,如果未能解决你的问题,请参考以下文章

QTabWidget 奇怪的行为

CL位置高程精度

奇怪的 Visual Studio 行为:执行时间很长

用于测试的模拟 CLLocationManager (swift)

如何判断 CLLocationManager 是不是正在主动扫描信标?

CL定位速度