我有一个在地图中插入注释的方法。此方法由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]; }
感谢的!!!
答案 0 :(得分:2)
在“updateMap”方法中,我改变了
if (!inMap) {
[self.mapView addAnnotation:annotation];
}
代表
[self.mapView performSelectorOnMainThread: @selector(addAnnotation:) withObject: annotation waitUntilDone: YES];
答案 1 :(得分:1)
你自己说:这是线索。除了主线程之外,你不能做任何影响接口的事情,这就是问题所在。
(当你解决这个问题时,如果我是你,我会从不使用NSThread。这是所有可能的方法来进行iOS线程化。)