我通过AWS S3异步加载图片并将MkMapView
图片设置为此图片。我的s3代码很长,但它可以在其他地方使用 - 我认为我将其缩小到@synchronized
问题。我使用此功能是因为在我的didSelectAnnotationView
中,我重新安排了NSMutableArray
,这需要线程安全。
我的步骤如下。首先,每当地图屏幕发生变化时,我都会下载该区域的用户并解析JSON repsonse。我将这些回复设置为NSMutableArray
通过
- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated {
@synchronized(self.trainerArray){
[self.trainerArray removeAllObjects];
for(NSDictionary* item in tempDict){
FSTrainer* tempTrainer = [[FSTrainer alloc] initWith:item];
//adding to temp array and map
[self.trainerArray addObject:tempTrainer];
TrainerPin* trainerPin = [[TrainerPin alloc] initWith:tempTrainer];
[self.mapView addAnnotation:trainerPin];
}
}
}
现在当我通过viewForAnnotation
(使用自定义重用标识符)进行设置时,这一切都正常,除非我快速或不规律地缩放,然后相同的图像被设置两次(第一个)。
- (MKAnnotationView *) mapView: (MKMapView *) mapView viewForAnnotation: (id) annotation {
TrainerPin* trainerPinForView = (TrainerPin*)annotation;
TrainerMapImage *pin = (TrainerMapImage *) [self.mapView dequeueReusableAnnotationViewWithIdentifier: [NSString stringWithFormat:@"trainerAnnotation%ld", (long)trainerPinForView.trainer.id]];
if (!pin) {
pin = [[TrainerMapImage alloc] initWithAnnotation: trainerPinForView reuseIdentifier: [NSString stringWithFormat:@"myPin%ld", (long)trainerPinForView.trainer.id]];
} else {
pin.annotation = trainerPinForView;
}
//custom method in TrainerMapImage
[pin asyonchronouslySetImage];
return pin;
}
另一件需要注意的事情是将它包装在GCD队列中总是返回每个MKMapView
的第一张图像