如何在最佳GPS位置调用URL API?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在最佳GPS位置调用URL API?相关的知识,希望对你有一定的参考价值。
我尝试在最佳的GPS位置调用URL API。用户单击触发findMe方法的按钮以设置desiredAccuracy和distanceFilter并运行[self.locationManager startUpdatingLocation]
。
我检查最佳的垂直和水平精度,如果它们在下一次迭代中没有改变,我运行API和[self.locationManager stopUpdatingLocation]
关键在于,即使我停止更新位置,最佳精度也会改变,并且-(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
会运行几次。
-(void)findMe {
self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
self.locationManager.distanceFilter = kCLDistanceFilterNone;
[self.locationManager startUpdatingLocation];
}
-(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
double longitude = newLocation.coordinate.longitude;
double latitude = newLocation.coordinate.latitude;
if ( ((_bestVertivalAccuracy == 0) || (_bestVertivalAccuracy > newLocation.verticalAccuracy))
|| ((_bestHorizontalAccuracy == 0) || (_bestHorizontalAccuracy > newLocation.horizontalAccuracy)) ) {
NSLog(@"bestVer: %f", _bestVertivalAccuracy);
NSLog(@"bestHor: %f", _bestHorizontalAccuracy);
NSLog(@"Given ver: %f", newLocation.verticalAccuracy);
NSLog(@"Given hor: %f", newLocation.horizontalAccuracy);
NSLog(@"-------------------------------------------------------");
_bestVertivalAccuracy = newLocation.verticalAccuracy;
_bestHorizontalAccuracy = newLocation.horizontalAccuracy;
return;
}
[_locationManager stopUpdatingLocation];
[POSharedLocation sharedInstance].lng = longitude;
[POSharedLocation sharedInstance].lat = latitude;
[POSharedLocation sharedInstance].showUserLocation = YES;
NSLog(@"Longitude : %f", longitude);
NSLog(@"Latitude : %f", latitude);
NSLog(@"Acc. Ver: %f", newLocation.verticalAccuracy);
NSLog(@"Acc. Hor: %f", newLocation.horizontalAccuracy);
NSLog(@"-------------------------------------------------------");
_resultsVC = [[ResultsListViewController alloc] init];
UINavigationController *navVC = [[UINavigationController alloc] initWithRootViewController:_resultsVC];
NSString *locationQuery = [NSString stringWithFormat:@"/json?method=find&lat=%f&lng=%f&distance=%f", latitude, longitude, _distance];
NSString *url = [API_URL stringByAppendingString:locationQuery];
NSString* urlEncoded = [url stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
// For debuging only
NSLog(@"URL: %@", urlEncoded);
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:urlEncoded]];
// Run an asynchronous connection and download the JSON
(void)[[NSURLConnection alloc] initWithRequest:request delegate:_resultsVC startImmediately:YES];
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
[self presentModalViewController:navVC animated:YES];
[navVC release];
}
并输出:
2013-05-30 12:59:13.906 MyApp[30569:907] bestVer: 0.000000
2013-05-30 12:59:13.918 MyApp[30569:907] bestHor: 0.000000
2013-05-30 12:59:13.922 MyApp[30569:907] Given ver: 3.000000
2013-05-30 12:59:13.927 MyApp[30569:907] Given hor: 50.000000
2013-05-30 12:59:13.933 MyApp[30569:907] -------------------------------------------------------
2013-05-30 12:59:14.112 MyApp[30569:907] Longitude : 16.934037
2013-05-30 12:59:14.114 MyApp[30569:907] Latitude : 51.096827
2013-05-30 12:59:14.116 MyApp[30569:907] Acc. Ver: 10.000000
2013-05-30 12:59:14.119 MyApp[30569:907] Acc. Hor: 1414.000000
2013-05-30 12:59:14.131 MyApp[30569:907] -------------------------------------------------------
2013-05-30 12:59:14.138 MyApp[30569:907] URL: http://example.com/json?method=find&lat=51.096827&lng=16.934037&distance=1.000000
2013-05-30 12:59:14.241 MyApp[30569:907] Longitude : 16.933006
2013-05-30 12:59:14.244 MyApp[30569:907] Latitude : 51.096140
2013-05-30 12:59:14.247 MyApp[30569:907] Acc. Ver: 10.000000
2013-05-30 12:59:14.248 MyApp[30569:907] Acc. Hor: 1414.000000
2013-05-30 12:59:14.250 MyApp[30569:907] -------------------------------------------------------
2013-05-30 12:59:14.253 MyApp[30569:907] URL: http://example.com/json?method=find&lat=51.096140&lng=16.933006&distance=1.000000
2013-05-30 12:59:14.256 MyApp[30569:907] Warning: Attempt to present <UINavigationController: 0x1e068fd0> on <HomeViewController: 0x1d572130> while a presentation is in progress!
2013-05-30 12:59:14.260 MyApp[30569:907] Longitude : 16.932491
2013-05-30 12:59:14.262 MyApp[30569:907] Latitude : 51.095797
2013-05-30 12:59:14.263 MyApp[30569:907] Acc. Ver: 10.000000
2013-05-30 12:59:14.264 MyApp[30569:907] Acc. Hor: 1414.000000
2013-05-30 12:59:14.269 MyApp[30569:907] -------------------------------------------------------
2013-05-30 12:59:14.287 MyApp[30569:907] URL: http://example.com/json?method=find&lat=51.095797&lng=16.932491&distance=1.000000
2013-05-30 12:59:14.291 MyApp[30569:907] Warning: Attempt to present <UINavigationController: 0x1d599790> on <HomeViewController: 0x1d572130> while a presentation is in progress!
2013-05-30 12:59:14.298 MyApp[30569:907] Longitude : 16.932234
2013-05-30 12:59:14.301 MyApp[30569:907] Latitude : 51.095625
2013-05-30 12:59:14.302 MyApp[30569:907] Acc. Ver: 10.000000
2013-05-30 12:59:14.303 MyApp[30569:907] Acc. Hor: 1414.000000
2013-05-30 12:59:14.304 MyApp[30569:907] -------------------------------------------------------
2013-05-30 12:59:14.307 MyApp[30569:907] URL: http://example.com/json?method=find&lat=51.095625&lng=16.932234&distance=1.000000
2013-05-30 12:59:14.309 MyApp[30569:907] Warning: Attempt to present <UINavigationController: 0x1e06c930> on <HomeViewController: 0x1d572130> while a presentation is in progress!
正如您所看到的,API被调用了几次,而它应该只被调用一次。知道如何让它变得更好吗?
尝试将nil设置为您的locationManagers委托
_locationManager.delegate = nil;
不要依赖于位置管理器调用您的委托方法特定次数。您无法控制位置管理器,因此根据特定行为,除了记录之外总是会给您带来问题。但是,您可以控制自己的代码,因此请按照您的意愿进行操作:如果您不再需要位置更新,请在不需要时委托方法忽略更新,或者只将位置管理器的委托设置为nil。
如建议的那样,将其添加为答案。
两种方法,
- 使用标志,在发出网址请求之前检查
flag=false
。发送url请求后设置flag=true
。 - 在视图控制器初始化期间,开始获取位置更新,存储coords并在
findMe
方法中使用存储的coords进行URL请求。
以上是关于如何在最佳GPS位置调用URL API?的主要内容,如果未能解决你的问题,请参考以下文章
Android API 30 及更高级别在后台获取 GPS 位置的最佳方式