CLLocationManager没有正确更新数据

当我尝试为LBS应用程序进行实验时,我遇到了问题。 当在模拟器中测试时,它似乎工作。 然后,我在iPhone上试了一下。 它没有按预期工作。

当我启动应用程序时,它会显示所有信息,例如我的位置纬度,经度,距离等等。但是,当我走开时​​,这些信息没有改变。 无论是运行应用程序还是我的iPhone自动关闭(然后再次打开应用程序),这些数据仍然保持不变。

当我关掉应用程序并重新启动它时,它可以显示更新信息。

这是我的代码

我在viewDidLoad中设置了CLLocationManager

- (void)viewDidLoad
{
    [super viewDidLoad];
    //setup locationManager
    locationManager =[[CLLocationManager alloc]init];
    locationManager.desiredAccuracy=kCLLocationAccuracyBest;
    locationManager.distanceFilter=kCLDistanceFilterNone;
    [locationManager setDelegate:self];
    [locationManager startUpdatingLocation];

}

这是CLLocationManager委托的代码

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

if (newLocation.horizontalAccuracy < 0) return;

NSTimeInterval locationAge = -[newLocation.timestamp timeIntervalSinceNow];

if (locationAge > 5.0) return;


 if (myLocation == nil || myLocation.horizontalAccuracy > newLocation.horizontalAccuracy) {

    self.myLocation = newLocation;
    // NSLog(@"mylocation=%@",self.myLocation);
    [self.mainTableView reloadData];
    [self sortedDistArray];//this method is to calculate distance and put it in array. It work...


    if (newLocation.horizontalAccuracy <= locationManager.desiredAccuracy) {
        [self stopLocationManager];    
    }
}

}

  • (void)stopLocationManager {[locationManager stopUpdatingLocation]; locationManager.delegate = nil; }
  • 现在,我有以下问题。

  • 我的CLLocationManager设置有什么问题? 我应该在appDelegate下面(在didFinishLaunchingWithOptions方法下)让它运行它的背景吗? 它会快速耗尽电池电量吗? 或者将它设置在ViewWillAppear而不是ViewDidLoad中?

  • 另一方面,我把'拉下来刷新'到程序中。 我认为刷新它时可以更新更新的数据。 但是,它不会起作用。 这里是我的刷新代码(我把EGOTableViewPullRefresh用于刷新功能)。

  • (空隙)reloadTableViewDataSource {

        //  should be calling your tableviews data source model to reload
      //  put here just for demo
    
    _reloading = YES;
    
     locationManager =[[CLLocationManager alloc]init];
     locationManager.desiredAccuracy=kCLLocationAccuracyBest;
     locationManager.distanceFilter=kCLDistanceFilterNone;
     [locationManager setDelegate:self];
     [locationManager startUpdatingLocation];
    
     [self sortedDistArray];
     [mainTableView reloadData];
    
     [self doneLoadingTableViewData];
    

    }

  • 我想到的是在用户刷新期间,CLLocationManager重置和开始更新位置。 但是,它没有工作。 我的错是什么?

    对不起,我有很多问题。 如果有人给我建议,我将不胜感激。


    您无法控制何时提供位置更新,您只能启动CLLocationManager ,操作系统将决定何时向您的CLLocationManagerDelegate提供更新。

    如果你想强制更新,你可以尝试检查CLLocationManager是否已经启动,如果是,停止并重启。

    顺便说一句,作为一个附注,我建议你将CLLocationManager包装在一个单例类中。 如果你继续启动位置管理器,它会在很多情况下使用应用程序运行并耗尽电池(当你实际停止时,我看不到你的代码)。 根据需要启动和停止CLLocationManager


    我不清楚你到底想要什么。 如果您只想在打开应用程序时显示位置,请将startupdatinglocation行移至viewDidAppear。 在屏幕上显示一个活动指示器,因为它需要一些时间回到并更新。

    如果您希望它不断更新,请不要调用stopUpdatingLocation。 只要您的位置更改以符合经理的设置,它就会触发委托方法。

    我注意到的另一件事,你的意思是说

    if (locationAge < 5.0) return;
    

    似乎你说5.0以上,在这种情况下,如果花费比获得更新更长的时间,你将永远不会对另一个做出反应。

    不要反复设置您的经理,而是创建一个单身人士或保存在一个属性中。 一旦启动,您只需根据需要启动/停止更新。

    您可能会从我的一些提示中受益:

    TTLocationHandler GitHub存储库

    链接地址: http://www.djcxy.com/p/20347.html

    上一篇: CLLocationManager didn't updated data properly

    下一篇: Where to put common UIAlertView code