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 奇怪的行为的主要内容,如果未能解决你的问题,请参考以下文章
用于测试的模拟 CLLocationManager (swift)