[iOS][MagicalRecord][CoreData] Обработка данных

У меня возникла проблема с картографическим приложением iOS. Я думаю, что это происходит из-за одновременного доступа к одним и тем же данным в одно и то же время. Но ошибка не совсем явная.

Что делает приложение:

  • добавить запись о местоположении, когда пользователь обновляет свое местоположение. (Менеджер местоположения)
  • отображать местоположение на карте (MapViewController)

Если я не добавляю какое-либо местоположение, я не получаю никакой ошибки. Если я добавлю один и в то же время покажу карту (которая использует запись о местоположении из MagicalRecord), я получу эту ошибку или плохой доступ:

ошибка: * Завершение работы приложения из-за необработанного исключения "CALayerInvalidGeometry", причина: "Позиция CALayer содержит NaN: [nan -2.60432e+07]"

Вот запись экрана с ошибкой: Запись экрана

Я сделал тест с выполнением всех манипуляций с данными в основном потоке, я до сих пор не могу понять ошибку

Если кто-то может мне помочь, он спасет мой день.

Спасибо.


person Adrien G    schedule 28.04.2013    source источник
comment
им жаль, что я не следую. пожалуйста, объясните еще раз, что вы ХОТИТЕ и что у вас есть   -  person Daij-Djan    schedule 28.04.2013
comment
Ошибка говорит о том, что вы пытаетесь установить кадр или положение или что-то еще с помощью NAN (не число).   -  person Iducool    schedule 28.04.2013


Ответы (2)


Очень маловероятно, что непосредственной причиной проблемы является неправильная обработка параллелизма, поскольку все ваши методы, связанные с пользовательским интерфейсом, должны вызываться в основном потоке, хотя это может быть основной причиной. Теперь, как говорит ошибка, происходит то, что координата позиции CALayer в какой-то момент устанавливается на NaN. Обычно это происходит из-за деления на ноль. Чтобы узнать, где это происходит, включите точки останова исключений. Когда вы увидите, какой слой вызывает исключение, посмотрите, является ли его x или y NaN, и если это так, посмотрите, где вы установили его как NaN.

person Valentin Radu    schedule 28.04.2013
comment
Я проверил все значения, используемые для отображения вещей на карте, также использовал точку останова. - person Adrien G; 28.04.2013

LocationManager:

- (void)setupLocationRecord:(CLLocation *)location {
LocationRecord *locationRecord = [LocationRecord createEntity];

locationRecord.latitude = [NSNumber numberWithDouble:location.coordinate.latitude];
locationRecord.longitude = [NSNumber numberWithDouble:location.coordinate.longitude];
locationRecord.createdAt = [NSDate date];
locationRecord.updatedAt = [NSDate date];

[[NSManagedObjectContext defaultContext] saveNestedContexts];

//[self performSelectorInBackground:@selector(addLocation:) withObject:locationRecord];
[locationRecord debug];
[self addLocation:locationRecord];

}

Мапвиевконтроллер:

- (void)setupMap {
NSArray *array = [LocationRecord findAllSortedBy:@"idLocation" ascending:YES];
NSLog(@"%s %@", __PRETTY_FUNCTION__, array);
self.mapView.locationsRecordList = [[NSMutableArray alloc] initWithArray:array];

}

person Adrien G    schedule 28.04.2013
comment
Это должно быть редактирование вашего вопроса, а не ответ. (Это не форум.) - person Sixten Otto; 28.04.2013