我正在使用CoreLocation来获取用户位置。我需要获取用户位置,然后将其发送到服务器。我有这一切工作,但是!我正在实施locationManager:(CCLLocationManager *)manager...
在找到位置之前,我的网址请求正在点击。什么是最好的方式:
我想确保在发送之前找到位置。我是否使用条件检查类的实例,并在块中命中服务器。我不需要继续更新,只需抓住一次并stopUpdatingLocation
之前正在阅读此帖:Getting Longitude/Latitude of the User When the viewDidLoad
到目前为止我所拥有的:
- (void)viewDidLoad {
[super viewDidLoad];
locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;
locationManager.desiredAccuracy = kCLLocationAccuracyThreeKilometers;
[locationManager startUpdatingLocation];
...more below... server request below here
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
NSLog(@"didUpdateToLocation: %@", newLocation);
CLLocation *currentLocation = newLocation;
if (currentLocation != nil) {
NSLog(@"found!");
[locationManager stopUpdatingLocation];
}
}
关于如何做到这一点的想法?我认为条件可能有效,但不确定是否有一种正确的方法来处理使用CoreLocation提供的方法。
答案 0 :(得分:0)
创建一个新方法,该方法将执行与位置相关的代码。然后,一旦你有了位置(即在NSLog之后(@“找到!”);行),就调用这个方法。
请注意,随着位置准确度的提高,可能会多次调用该方法 - 您可能希望处理此问题。
例如:
- (void)viewDidLoad {
[super viewDidLoad];
locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;
locationManager.desiredAccuracy = kCLLocationAccuracyThreeKilometers;
[locationManager startUpdatingLocation];
}
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
NSLog(@"didUpdateToLocation: %@", newLocation);
CLLocation *currentLocation = newLocation;
if (currentLocation != nil)
{
NSLog(@"found!");
[self handleLocation:newLocation];
[locationManager stopUpdatingLocation];
}
}
- (void)handleLocation:(CLLocation*)location
{
// handling code here
}
答案 1 :(得分:0)
位置管理器是异步的。您必须要求更新位置,然后等待它回电。
更糟糕的是,前几次更新通常都是需要丢弃的垃圾。
第一个位置更新通常会有一个时间戳,即几小时,几天甚至几周。首先必须检查以确保时间戳在最后几秒内。
完成后,您需要检查水平精度,并确保读数足够准确。通常当您第一次启动位置管理器时,前几个读数的准确度值超过一公里,这很糟糕。 (准确度实际上是一个半径值。你只能确定你得到的位置是指定半径的圆圈内的某个位置。)你需要提出一个特定于应用程序的精度读数“足够好”,然后扔掉远离准确度读数,直到你得到一个足够好的。您还需要检查负精度读数,这意味着GPS返回无效值。
接下来,您必须考虑GPS在合理时间内没有安定下来的情况。 (有时可能需要几分钟,或者根本无法获得良好的阅读。)在这种情况下,您需要将其作为失败处理。
因此,要处理编写locationManager所需的所有内容:didUpdateLocation:检查时间戳和水平精度的方法,以确保读数实际上是好的。如果在合理的等待后无法获得合适的位置,您还需要确保超时并报告失败。一种方法是在您第一次开始位置更新时启动“放弃”计时器,并在获得良好读数后将其杀死。如果计时器触发,请停止位置更新并向用户报告“无法获得良好的位置读取”错误。要知道花费10或15秒来获得正确的准确度读数并不罕见。