Добавление MKannotation к представлению карты вызывает ошибку EXC_BAD_ACCESS

После того, как я обновил данные Core с правильным значением, я хотел бы добавить эти значения в представление карты. Вот код, который я написал для этого:

-(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] = {}

который это похоже на указатель на пустую сущность. есть ли у вас идеи, как я могу решить это? Спасибо

1 ответ

После отправки отчета об ошибке Apple сообщила мне решение моей проблемы. Проблема заключалась в том, что я обновлял координаты не в соответствии с КВО. Я храню свойства, как вы, с широтой и долготой. Попробуйте добавить это в свой класс Photo.

- (void)willChangeValueForKey:(NSString *)key
{
    if ([key isEqualToString:@"latitude"] || [key isEqualToString:@"longitude"]) { [self willChangeValueForKey:@"coordinate"]; }
    [super willChangeValueForKey:key];
}

- (void)didChangeValueForKey:(NSString *)key
{
    if ([key isEqualToString:@"latitude"] || [key isEqualToString:@"longitude"]) { [self didChangeValueForKey:@"coordinate"]; }
    [super didChangeValueForKey:key];
}

Надеюсь это поможет.

Другие вопросы по тегам