确保locationManager已完成然后执行请求

时间:2014-01-05 04:16:31

标签: ios objective-c core-location

我正在使用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提供的方法。

2 个答案:

答案 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秒来获得正确的准确度读数并不罕见。