2016-07-18 3 views
2

iOSでSkobbler Mapsを使用する場合の例外の取得。配列のアクセスが無効になる同時実行例外のようだが、Skobblerの提供コードに問題があるため、壊れたコードを修正する最良の方法がわからない。Skobbler didFinishRouteCalculationWithInfo配列例外

"HERE !!!"と記された行を参照してください。

ファイル:以下のコードでSKTNavigationManager.m

- (void)routingService:(SKRoutingService *)routingService didFinishRouteCalculationWithInfo:(SKRouteInformation *)routeInformation { 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     __block BOOL routeExists = NO; 
     [_calculatedRoutes enumerateObjectsUsingBlock:^(SKRouteInformation *obj, NSUInteger idx, BOOL *stop) { 
      if (routeInformation.routeID == obj.routeID) { 
       routeExists = YES; 
       *stop = YES; 
      } 
     }]; 

     if (!routeInformation.corridorIsDownloaded || routeExists || _calculatedRoutes.count == _configuration.numberOfRoutes) { 
      return; 
     } 

     //are we still calculating the routes? 
     if ([self hasState:SKTNavigationStateCalculatingRoute]) { 
      [_calculatedRoutes addObject:routeInformation]; 

      //stop progress for the calculated route 
      SKTRouteProgressView *progressVIew = _mainView.calculatingRouteView.progressViews[_calculatedRoutes.count - 1]; // HERE!!! 
      [progressVIew startProgress]; 

      //show the info for the calculated route 
      [_mainView.calculatingRouteView showInfoViewAtIndex:_calculatedRoutes.count - 1]; 
      [self updateCalculatedRouteInformationAtIndex:_calculatedRoutes.count - 1]; 

      //start progress for next route if needed 
      if (_calculatedRoutes.count < _mainView.calculatingRouteView.numberOfRoutes) { 
       SKTRouteProgressView *progressVIew = _mainView.calculatingRouteView.progressViews[_calculatedRoutes.count]; 
       [progressVIew startProgress]; 
      } 

      if (!_selectedRoute) { 
       _selectedRoute = routeInformation; 
       [SKRoutingService sharedInstance].mainRouteId = _selectedRoute.routeID; 
       [self zoomOnSelectedRoute]; 
       _mainView.calculatingRouteView.selectedInfoIndex = 0; 
       _mainView.calculatingRouteView.startButton.hidden = NO; 
      } 
     } else if ([self hasState:SKTNavigationStateRerouting]) { //nope, we're being rerouted 
      _selectedRoute = routeInformation; 
      _navigationInfo.currentDTA = _selectedRoute.distance; 
      [self updateDTA]; 
      _navigationInfo.currentETA = _selectedRoute.estimatedTime; 
      [self updateETA]; 
      [SKRoutingService sharedInstance].mainRouteId = _selectedRoute.routeID; 
      [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(removeReroutingState) object:nil]; 
      [self performSelector:@selector(removeReroutingState) withObject:nil afterDelay:kMinReroutingDisplayTime]; 
     } 
    }); 
} 

報告例外はある...

8 libobjc.A.dylib - objc_exception_throw + 332 (objc-exception.mm:568) 
9 CoreFoundation - [__NSArrayM objectAtIndex:] + 240 (NSArray.m:410) 
10 MyApp -[SKTNavigationManager routingService:didFinishRouteCalculationWithInfo:]_block_invoke + 676 (SKTNavigationManager.m:463) 

任意のアイデアは?私はprogressViews配列から読み取る前に_calculatedRoutesのサイズを調べることができましたが、問題は両方にアクセスする行の後に追加コードがあることです。言い換えれば、私はラインを避けることができますが、私はどのように正しく動作するようにメソッドを修正するのですか?

答えて

1

SKTNavigationManager内のコード(およびSDKToolsプロジェクト全体)はオープンコードとして提供されています。これはSDK自体の一部ではありませんが、一般的なシナリオに対処するためのデモコード/ヘルパークラスを構成しますUI、オフラインマップを扱うなど)。

一部の開発者はこのコードをドキュメントとして使用し、他の開発者はプロジェクトで「そのまま」使用し、他の開発者はそれを使用して好みからカスタマイズします。

私はこの一貫性のない状態(バニラコード、デモプロジェクトでは私はこれを複製できません)にどのように到着したのかよく分かりません。あなたが並行性の問題があると思われる場合は、追加のチェックまたは同期メカニズム。