MKAnnotation 不会出现在使用 NSThread 的地图中

Posted

技术标签:

【中文标题】MKAnnotation 不会出现在使用 NSThread 的地图中【英文标题】:MKAnnotation don't appear in map using NSThread 【发布时间】:2014-01-10 17:51:51 【问题描述】:

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

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

插入注释后,我正在使用[CATransaction flush],但它不起作用。

代码上方:

映射委托方法:

- (void) mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated log(@"区域改变"); 如果(_userRegion.center.latitude) log(@"移动地图。新位置:%f X %f", self.mapView.centerCoordinate.latitude, self.mapView.centerCoordinate.longitude); NSDictionary *坐标 = @ @"latitude": [NSString stringWithFormat:@"%f", self.mapView.centerCoordinate.latitude], @"longitude": [NSString stringWithFormat:@"%f", self.mapView.centerCoordinate.longitude] ; NSThread *thread = [[NSThread alloc] initWithTarget:self 选择器:@selector(updateMap:) object:coordinates]; [线程开始]; 如果(_userMenuOpened) [自我关闭用户菜单]; 如果(_settingsMenuOpened) [自我关闭设置菜单];

插入注解的方法:

- (void) updateMap:(NSDictionary *) 坐标 NSArray *annotationsInMap = [self.mapView 注释]; _busStops = [_ws getStations:10 lat:[[coordinates valueForKey:@"latitude"] doubleValue] lng:[[coordinates valueForKey:@"longitude"] doubleValue]]; for(NSString *stop in _busStops) 布尔 inMap = 否; BPBusStopAnnotation *annotation = [[BPBusStopAnnotation alloc] initWithData:stop]; //Se tiver annotation no mapa verifica se os que vem no WS sao os mesmos 如果(annotationsInMap.count > 0) for(BPBusStopAnnotation *pt in annotationsInMap) if(pt && ![pt isKindOfClass:[MKUserLocation 类]]) if([annotation.codigo isEqual:pt.codigo]) inMap = 是的; 休息; 如果(!inMap) [self.mapView addAnnotation:annotation]; [CATransaction 刷新];

谢谢!!!

【问题讨论】:

相关:***.com/questions/1995245/iphone-mapview-interrupted 【参考方案1】:

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

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

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

【讨论】:

【参考方案2】:

你自己说过:这是线程。除了主线程,你不能做任何影响界面的事情,这就是问题所在。

(当你解决这个问题时,如果我是你,我将永远使用 NSThread。这是所有可能的 ios 线程方法中最糟糕的。)

【讨论】:

感谢您的回答@matt,但我该如何解决我的问题?我需要在该委托方法中调用 ws,但如果我在主线程中这样做,它会冻结屏幕直到完成 ws 调用。 当你想在后台做事时你会进入后台线程,当你想在主线程中做事时(例如更新界面)回到主线程。 它可能会帮助您在继续之前停止并了解 iOS 中的线程。例如,请参阅the Threads chapter of my book。

以上是关于MKAnnotation 不会出现在使用 NSThread 的地图中的主要内容,如果未能解决你的问题,请参考以下文章

PFObject作为MKAnnotation导致NSInternalInconsistencyException

单击时执行特定操作的自定义 MKAnnotation 引脚 - 自定义引脚未显示

如何使用自动布局在 MKAnnotation 中显示多行?

iPhone:创建 MKAnnotation

如何将 MKAnnotation 添加到领域 [关闭]

使用 CLGeocoder 将城市和州信息添加到 MKAnnotation