didUpdateToLocation不会立即被调用

时间:2011-08-23 06:08:26

标签: iphone cllocationmanager

我正在使用

  

startMonitoringSignificantLocationChanges

获取(lat,lon)值。我的问题是

  
      
  • (void)locationManager:(CLLocationManager *)manager   didUpdateToLocation:(CLLocation *)newLocation        fromLocation:(CLLocation *)oldLocation
  •   
遇到[locationMangerObject startMonitoringSignificantLocationChanges];后,不会立即调用

方法。仅在didUpdateToLocation方法内部,我保留两个全局双变量来保存纬度和经度,这些变量将根据从{{1}获得的坐标设置这些值被传递给webservice,因为didUpdateToLocation只被调用一定的延迟,在这些延迟之间,(lat,lon)的参数将零作为它们的值并传递给服务,从而导致意外的响应。

如何制作

  
      
  • (void)locationManager:(CLLocationManager *)manager   didUpdateToLocation:(CLLocation *)newLocation        fromLocation:(CLLocation *)oldLocation
  •   

在`[locationMangerObject startMonitoringSignificantLocationChanges]之后立即调用的方法;遇到了。

请有人建议我解决此问题的解决方案。

提前致谢。

4 个答案:

答案 0 :(得分:5)

也许您应该考虑使用 startUpdatingLocation 方法而不是 startMonitoringSignificantLocationChanges 。来自iOS文档:

startUpdatingLocation

此方法立即返回。调用此方法会导致位置管理器获取初始位置修复(可能需要几秒钟),并通过调用其locationManager:didUpdateToLocation:fromLocation:method来通知您的委托。

答案 1 :(得分:1)

根据您是否有小区连接或无线连接,以及GPS卫星是否有良好的信号,可能需要几秒到几分钟才能获得一个好的位置。但是,您应该立即获得缓存(可能过时)的位置。

您是否为locationMangerObject设置了委托?

在调用startMonitoringSignificantLocationChanges后,您的函数是否返回到runloop?

答案 2 :(得分:0)

///Hmmmmm

            ...CLLocationManager does n't call delegate method properly 
            ...after lot of R&D I'm  using a watchdog method it calls " -(void)locationadd " function every 10seconds and i'm using that location for drawing the path.

  -(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
     {
     }       



 - (void)viewDidLoad
     {

   [NSTimer scheduledTimerWithTimeInterval:10
                                         target:self
                                           selector:@selector(locationadd)
                                           userInfo:nil
                                           repeats:YES];

        }


        -(void)locationadd   
        {

         if ([locationManager location]) {



        //i'm saving this location

    CLLocation *locat=locationManager.location;

     }

        }
        //

答案 3 :(得分:0)

这是因为方法startMonitoringSignificantLocationChanges()监视位置的重大变化。因此,当位置或过去位置更新的时间戳存在度量差异时,它不会一直调用位置更新。

最好使用startUpdatingLocation(),它会被频繁调用,因此您会在didUpdateLocations()内部获得位置更改。