После того, как я обновил данные Core с нужным значением, я хотел бы добавить это значение в представление карты. Это код, что я бы написал для этого это так:Добавление MKannotation к вызову mapview вызывает ошибку EXC_BAD_ACCESS
-(void)updateMapWithPredicate:(NSPredicate *)predicate
{
int numberOfElementiOnMap = 0;
dispatch_async(dispatch_get_main_queue(), ^{
[self.ActiviIndicator startAnimating];
[self.mapView removeAnnotations:self.mapView.annotations];
});
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Photo"];
if (predicate) {
request.predicate = [NSCompoundPredicate andPredicateWithSubpredicates:@[[NSPredicate predicateWithFormat:@"(latitude != nil) AND (longitude != nil)"]
,predicate]];
} else {
request.predicate = [NSPredicate predicateWithFormat:@"(latitude != nil) AND (longitude != nil)"];
}
//Get all different coordinate from core data.
[request setPropertiesToFetch:@[@"latitude", @"longitude"]];
[request setReturnsDistinctResults:YES];
[request setResultType:NSDictionaryResultType];
// Execute the fetch
NSError *error = nil;
NSArray *photos = [self.context executeFetchRequest:request error:&error];
for (NSDictionary *coordinateDic in photos) {
NSPredicate *predicateToSend;
if (predicate) {
/* Get all pictures that corresponding to the coordinate inside the coordinateDic
*/
predicateToSend = [NSCompoundPredicate andPredicateWithSubpredicates:@[[NSPredicate predicateWithFormat:@"(latitude == %@) AND (longitude == %@)",
[coordinateDic valueForKey:@"latitude"], [coordinateDic valueForKey:@"longitude"]],predicate]];
} else {
predicateToSend = [NSPredicate predicateWithFormat:@"(latitude == %@) AND (longitude == %@)",[coordinateDic valueForKey:@"latitude"], [coordinateDic valueForKey:@"longitude"]];
}
dispatch_async(dispatch_get_main_queue(), ^{
//get all picture with the same lautide and longitude that are specified on predicate
NSArray *photos2 = [Photo pictureFromContext:self.context withPredicate:predicateToSend];
//if the pictures are more then one, we add only one picture, and we write the number of pictures as a subtitle of the mkannotationview
if ([photos2 count] > 1) {
Photo *photo = [photos2 lastObject];
photo.photoDescription = [NSString stringWithFormat:@"album with %lu picures",(unsigned long)[photos2 count]];
if (photo) {
// [self.mapView addAnnotation:photo];
}
} else { //add the only pictures
if ([photos2 firstObject]) {
[self.mapView addAnnotation:[photos2 firstObject]];
}
}
});
}
}
В этом коде я в основном получить значение, которое нуждается от даты ядра, а затем добавить его к карте.
Объекты, которые я добавляю на карту, очевидно, соответствуют протоколу <MKAnnotation>
. Я получил ошибку на линии [self.mapView addAnnotation:[photos2 firstObject]];
. Странным фактом является то, что некоторый объект, который я получаю от основной даты, правильно добавляется к карте. Я попытался отладить код, включив NSZombie, но я получил ту же ошибку. Я также проверяю координаты и все в порядке. Единственное различие, которое я нашел в то время как я отладки кода это так: объект, правильно добавлены в карты выглядит в отладчике:
Вместо когда я получаю сообщение об ошибке, то объект, который я добавляю к карте выглядит, как это на тренажере:
и когда я напечатать содержание: 0 я получаю это:
Printing description of *([0]->[0]):
(Photo_Photo_) [0] = {}
который выглядит как указатель на пустой объект. Есть ли у вас какое-то представление о том, как я могу это решить? Thanks
Когда вы говорите, что «какой-то объект, который я получаю с базовой даты, правильно добавлен в карту», вы говорите, что у вас есть успешные аннотации карт, представленные в MapView, и эта ошибка происходит только некоторое время? – BHendricks
Да, нормальное поведение: Открыть приложение -> перейти к отображению карты -> добавить mkannotation на карту из основных данных (все работает нормально) ---> обновить данные ядра ---> обновить карта с новым значением данных ядра -> crash –
Таким образом, я не уверен на 100%, но проблема может заключаться в том, что вы пытаетесь добавить один и тот же объект (хотя и модифицированный) к виду карты без предварительного удаления аннотации. Попробуйте удалить аннотацию с карты, прежде чем добавлять ее обратно, и посмотрите, поможет ли это. – BHendricks