3

最適な GPS 位置で URL API を呼び出そうとします。ユーザーは、 findMeメソッドを起動するボタンをクリックして、desiredAccuracydistanceFilterを設定して実行します[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 は 1 回だけ呼び出す必要があるのに、数回呼び出されます。それを改善する方法はありますか?

4

3 に答える 3

1

デリゲート メソッドを特定の回数呼び出すロケーション マネージャーに依存しないでください。あなたはロケーションマネージャーを制御していないので、文書化されているものを超えた特定の動作に依存すると、常に問題が発生します. ただし、独自のコードを制御することはできます。したがって、必要に応じてコードを実行してください。場所の更新が不要になった場合は、不要なときにデリゲート メソッドで更新を無視するか、単に場所マネージャーのデリゲートを nil に設定します。

于 2013-05-30T12:14:48.477 に答える
0

提案どおり、回答として追加します。

これを行う2つの方法、

  1. フラグを使用して、flag=falseURL リクエストを行う前に確認してください。URL リクエストが送信された後、 set flag=true.
  2. ビューコントローラーの初期化中に、位置の更新の取得を開始し、座標を保存し、findMeメソッドで保存された座標を使用して URL 要求を作成します。
于 2013-05-30T12:25:34.757 に答える