当我尝试使用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 Delegate
的代码- (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];
}
}
}
现在,我有以下问题。
我的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重置并在用户刷新期间启动更新位置。但是,它没有用。我的错是什么?
对不起,我有很多问题。如果有人给我建议,我将不胜感激。
答案 0 :(得分:0)
您无法控制何时提供位置更新,您只能启动CLLocationManager
,操作系统将决定何时为您的CLLocationManagerDelegate
提供更新。
如果您希望强制更新,可以尝试检查CLLocationManager
是否已经启动,如果已经启动,请停止并重新启动。
顺便提一下,作为旁注,我建议你将CLLocationManager包装在一个单例类中。如果您继续启动位置管理器,它将在许多情况下与应用程序一起运行并耗尽电池(当您实际停止时,我无法在您的代码中看到)。根据需要启动和停止CLLocationManager
。
答案 1 :(得分:0)
我不清楚你究竟想要什么。如果您只想在打开应用程序时显示位置,请将startupdatinglocation行移至viewDidAppear。在屏幕上显示活动指示器,因为它需要一些时间进入并更新。
如果您希望不断更新,请不要调用stopUpdatingLocation。只要您的位置发生变化,它就会触发委托方法,以满足经理的设置。
我注意到的另一件事,你的意思是说
if (locationAge < 5.0) return;
似乎你说的比5.0更好,在这种情况下,如果需要更长的时间来获得更新,你将永远不会回复另一个。
不是重复设置您的经理,而是创建单身人士或保存在房产中。启动后,您只需根据需要启动/停止更新。
您可以从我的一些提示中受益: