2016-07-18 26 views
2

在iOS中使用Skobbler地圖時發生異常。看起來像一個併發異常導致無效的數組訪問,但由於它是來自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,處理離線地圖等)。

一些開發人員使用此代碼作爲文檔,其他人在其項目中「按原樣」使用,其他人則從其開始並根據自己的喜好進行自定義。

在你的特殊情況下,我不確定你是如何到達這種不一致的狀態的(使用vanilla代碼,在演示項目中,我無法複製這個) - 如果你認爲你有一個併發問題可以隨意插入額外的檢查或同步機制。