MKAnnotation不会使用NSThread显示在地图中

时间:2014-01-10 17:51:52

标签: ios objective-c mapkit mkannotation nsthread

我有一个在地图中插入注释的方法。此方法由map的委托方法调用。

问题是注释没有出现在地图中。我必须再次触摸地图以显示注释。

插入注释后,我正在使用[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];

}

感谢的!!!

2 个答案:

答案 0 :(得分:2)

在“updateMap”方法中,我改变了

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

代表

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

答案 1 :(得分:1)

你自己说:这是线索。除了主线程之外,你不能做任何影响接口的事情,这就是问题所在。

(当你解决这个问题时,如果我是你,我会从不使用NSThread。这是所有可能的方法来进行iOS线程化。)