使用后台线程从URL加载注释。 在移动或缩放mapView之前,引脚不会显示

我使用后台线程从url加载注释。 在移动或缩放mapView之前,引脚不会显示。 我该如何更新我的观点?

我的viewDidAppear

- (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; //Create the thread [NSThread detachNewThreadSelector:@selector(loadPList) toTarget:self withObject:nil]; } 

loadPList

 - (void) loadPList { //Load the plist NSString *urlStr = [[NSString alloc] initWithFormat:@"http://www.domain.com/data.xml"]; NSURL *url = [NSURL URLWithString:urlStr]; NSDictionary *dict = [[NSDictionary alloc] initWithContentsOfURL:url]; NSMutableArray *annotations = [[NSMutableArray alloc]init]; NSArray *annotationsOnMap = mapView.annotations; if ([annotationsOnMap count] > [annotations count]) { [mapView removeAnnotations:annotationsOnMap]; } else { //Do nothing } if ([[NSUserDefaults standardUserDefaults] boolForKey:@"blackKey"]) { NSArray *ann = [dict objectForKey:@"Category1"]; for(int i = 0; i < [ann count]; i++) { NSString *coordinates = [[ann objectAtIndex:i] objectForKey:@"Coordinates"]; double realLatitude = [[[coordinates componentsSeparatedByString:@","] objectAtIndex:1] doubleValue]; double realLongitude = [[[coordinates componentsSeparatedByString:@","] objectAtIndex:0] doubleValue]; MyAnnotation *myAnnotation = [[MyAnnotation alloc] init]; CLLocationCoordinate2D theCoordinate; theCoordinate.latitude = realLatitude; theCoordinate.longitude = realLongitude; myAnnotation.coordinate=CLLocationCoordinate2DMake(realLatitude,realLongitude); myAnnotation.title = [[ann objectAtIndex:i] objectForKey:@"Name"]; myAnnotation.subtitle = [[ann objectAtIndex:i] objectForKey:@"Address"]; myAnnotation.icon = [[ann objectAtIndex:0] objectForKey:@"Icon"]; [mapView addAnnotation:myAnnotation]; [annotations addObject:myAnnotation]; } } else { //Do nothing } //And same with other categories.... //Update the ui dispatch_async(dispatch_get_main_queue(), ^{ }); } 

您正在从非UI更新UI – 线程这将无法正常工作

您将不得不调用在UIThread块内更新ui的代码段,如下所示:

例如

 [mapView removeAnnotations:annotationsOnMap]; 

必须在UI-Thread中调用

  dispatch_async(dispatch_get_main_queue(), ^{ //Update UI if you have to [mapView removeAnnotations:annotationsOnMap]; }); 

请注意,您必须在main_queue线程内调用所有UI更新

  dispatch_async(dispatch_get_main_queue(), ^{ //All UI updating code must come here });