异步设置MKAnnotationView错误的图像

时间:2015-02-08 21:04:18

标签: mapkit mkannotationview

我通过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的第一张图像

0 个答案:

没有答案