2014-08-13 5 views
1

После того, как я обновил данные 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, но я получил ту же ошибку. Я также проверяю координаты и все в порядке. Единственное различие, которое я нашел в то время как я отладки кода это так: объект, правильно добавлены в карты выглядит в отладчике:

enter image description here

Вместо когда я получаю сообщение об ошибке, то объект, который я добавляю к карте выглядит, как это на тренажере:

enter image description here

и когда я напечатать содержание: 0 я получаю это:

Printing description of *([0]->[0]): 
(Photo_Photo_) [0] = {} 

который выглядит как указатель на пустой объект. Есть ли у вас какое-то представление о том, как я могу это решить? Thanks

+0

Когда вы говорите, что «какой-то объект, который я получаю с базовой даты, правильно добавлен в карту», ​​вы говорите, что у вас есть успешные аннотации карт, представленные в MapView, и эта ошибка происходит только некоторое время? – BHendricks

+0

Да, нормальное поведение: Открыть приложение -> перейти к отображению карты -> добавить mkannotation на карту из основных данных (все работает нормально) ---> обновить данные ядра ---> обновить карта с новым значением данных ядра -> crash –

+0

Таким образом, я не уверен на 100%, но проблема может заключаться в том, что вы пытаетесь добавить один и тот же объект (хотя и модифицированный) к виду карты без предварительного удаления аннотации. Попробуйте удалить аннотацию с карты, прежде чем добавлять ее обратно, и посмотрите, поможет ли это. – BHendricks

ответ

0

После отправки отчета об ошибке Apple сообщила мне о решении моей проблемы. Проблема заключалась в том, что я обновлял координату не соответствующим KVO. Я храню свойства, подобные вам, с широтой и долготой. Попробуйте добавить это в свой класс 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]; 
} 

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

Смежные вопросы