2014-01-10 3 views
1

У меня есть метод, который вставляет аннотации на карту. Этот метод вызывается методом делегирования карты.MKAnnotation не отображаются на карте, используя NSThread

Проблема в том, что аннотации не отображаются на карте. Я должен коснуться карты еще раз, чтобы показать аннотации.

После вставки аннотаций я использую [CATRansaction flush], но это не работает.

Над кодом:

Карта делегирован метод:

 
- (void) mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated{ 

    log(@"region changed"); 

    if (_userRegion.center.latitude) { 
     log(@"Move map. New location: %f X %f", self.mapView.centerCoordinate.latitude, self.mapView.centerCoordinate.longitude); 

     NSDictionary *coordinates = @{ 
             @"latitude": [NSString stringWithFormat:@"%f", self.mapView.centerCoordinate.latitude], 
             @"longitude": [NSString stringWithFormat:@"%f", self.mapView.centerCoordinate.longitude] 
             }; 
     NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(updateMap:) object:coordinates]; 
     [thread start]; 
    } 

    if(_userMenuOpened){ 
     [self closeUserMenu]; 
    } 

    if(_settingsMenuOpened){ 
     [self closeSettingsMenu]; 
    } 

} 

Метод, который вставляет аннотацию:

 
- (void) updateMap:(NSDictionary *) coordinates { 

    NSArray *annotationsInMap = [self.mapView annotations]; 

    _busStops = [_ws getStations:10 lat:[[coordinates valueForKey:@"latitude"] doubleValue] lng:[[coordinates valueForKey:@"longitude"] doubleValue]]; 

    for(NSString *stop in _busStops) { 

     BOOL inMap = NO; 
     BPBusStopAnnotation *annotation = [[BPBusStopAnnotation alloc] initWithData:stop]; 

     //Se tiver annotation no mapa verifica se os que vem no WS sao os mesmos 
     if(annotationsInMap.count > 0){ 

      for(BPBusStopAnnotation *pt in annotationsInMap){ 
       if(pt && ![pt isKindOfClass:[MKUserLocation class]]){ 

        if([annotation.codigo isEqual:pt.codigo]){ 
         inMap = YES; 
         break; 

        } 
       } 
      } 

     } 

     if (!inMap) { 
      [self.mapView addAnnotation:annotation]; 
     } 

    } 

    [CATransaction flush]; 

} 

Спасибо !!!-х

+1

по теме: http://stackoverflow.com/questions/1995245/iphone-mapview-interrupted – Anna

ответ

1

В методе «updateMap», I изменено

if (!inMap) { 
    [self.mapView addAnnotation:annotation]; 
} 

для

[self.mapView performSelectorOnMainThread: @selector(addAnnotation:) withObject: annotation waitUntilDone: YES]; 
1

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

(И в то время как вы фиксируете это, если бы я тебя, я бы никогда использование NSThread. Это самое худшее из всех возможных способов сделать IOS резьба. Был)

+0

Спасибо за ваш ответ @m att, но как я могу решить свою проблему? Мне нужно вызвать ws в этом методе делегата, но если я сделаю это в основном потоке, он замораживает экран до завершения вызова ws. –

+1

Вы входите в фоновый поток, когда хотите делать что-то в фоновом режиме, и возвращаетесь к основному потоку, когда хотите сделать материал в основном потоке (например, обновите интерфейс). – matt

+1

Это может помочь вам остановиться и узнать о потоковом в iOS, прежде чем идти дальше. См., Например, раздел [разделы «Темы» моей книги] (http://www.apeth.com/iOSBook/ch38.html). – matt

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