2016-07-18 8 views
2

Получение исключения при использовании Skobbler Maps в iOS. Похоже, что это исключение параллелизма, которое приводит к недопустимому доступу к массиву, но поскольку это проблема с предоставленным кодом от Skobbler, не знаете, как наилучшим образом исправить свой сломанный код.Skobbler didFinishRouteCalculationWithInfo array exception

Посмотрите на строку с надписью «ЗДЕСЬ!» в коде ниже:

Файл: 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) 

Любые идеи? Я мог бы проверить размер _calculatedRoutes перед чтением из массива progressViews, но проблема у меня есть, есть дополнительный код после строки, которая обращается к обоим. Другими словами, я могу избежать линии, но как я могу исправить метод для правильной работы?

ответ

1

Код внутри SKTNavigationManager (и внутри всего проекта SDKTools) предлагается в виде открытого кода - он не является частью самого SDK, а представляет собой некоторые классы демонстрационного кода/помощника, которые должны помочь вам разобраться с общими сценариями (создание простой навигации Пользовательский интерфейс, работа с автономными картами и т. Д.).

Некоторые разработчики используют этот код в качестве документации, другие используют его как «как есть» в своих проектах, другие начинают с него и настраивают его по своему вкусу.

В вашем конкретном случае я не уверен, как вы достигли этого несогласованного состояния (с кодом ванили, в демонстрационном проекте я не могу воспроизвести это) - если вы считаете, что у вас проблема параллелизма, не стесняйтесь вставлять дополнительные проверки или механизмы синхронизации.