【问题标题】:Ensure locationManager has finished then perform request确保 locationManager 已完成然后执行请求
【发布时间】:2014-01-05 04:16:31
【问题描述】:

我正在使用 CoreLocation 来获取用户位置。我需要获取用户位置,然后将其发送到服务器。我有这一切工作,但是!我正在执行locationManager:(CCLLocationManager *)manager...

在找到该位置之前,我的 url 请求已命中。最好的方法是:

  • 请求位置
  • 存储在字符串中
  • 向请求发送字符串

我想确保在发送之前找到该位置。我是否使用条件检查类的实例并且在块内命中服务器。我不用一直更新,抓一次就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 提供的方法来处理它。

【问题讨论】:

    标签: ios objective-c core-location


    【解决方案1】:

    创建一个执行与位置相关的代码的新方法。然后一旦你有了位置(即在 NSLog(@"found!"); 行之后),调用这个方法。

    请注意,随着位置准确性的提高,该方法可能会被多次调用 - 您可能需要处理这个问题。

    例如:

    - (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
    }
    

    【讨论】:

      【解决方案2】:

      位置管理器是异步的。您必须要求更新位置,然后等待它给您回电。

      更糟糕的是,前几次更新通常是需要丢弃的垃圾。

      第一次位置更新通常具有几小时、几天甚至几周的时间戳。您首先必须检查以确保时间戳在最后几秒内。

      完成后,您需要检查水平精度,并确保读数足够准确。通常,当您第一次启动位置管理器时,前几个读数的准确度值超过一公里,这很糟糕。 (准确度实际上是一个半径值。您只能确保您获得的位置位于具有指定半径的圆内。)您需要提出一个“足够好”的特定于应用程序的准确度读数,然后抛出直到你得到一个足够好的读数。您还需要检查负精度读数,这意味着 GPS 返回的值无效。

      接下来,您必须考虑 GPS 未在合理时间内稳定下来的情况。 (有时可能需要几分钟,或者根本无法获得良好的读数。)在这种情况下,您需要将其视为失败。

      因此,要处理您需要编写 locationManager:didUpdateLocation: 方法来检查时间戳和水平精度以确保读数确实良好的所有操作。如果在合理的等待后无法获得合适的位置读数,您还需要确保超时并报告失败。一种方法是在您第一次开始位置更新时启动一个“放弃”计时器,并在您获得良好的阅读后,将其终止。如果计时器触发,请停止位置更新并向您的用户报告“无法获得良好的位置读数”错误。了解需要 10 或 15 秒才能获得体面的准确读数的情况并不少见。

      【讨论】:

      • 哦哇很高兴知道。在这个应用案例中,我正在显示潮汐,因此它是最近的潮汐站点,感谢上帝不需要超级准确的读数,但无论如何,在将数据返回给用户之前,我仍然应该考虑这些事情。欣赏它。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-28
      • 2019-11-26
      • 1970-01-01
      • 2019-01-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多