注釈が付いたマップを表示するカスタムビューコントローラクラスを作成しました。アノテーションが押されると、コールアウトが表示され、サムネイル画像がアノテーションコールアウトの左側に表示されます。このクラスは、デリゲートに表示される画像を提供するように要求します。GCDを使用して別のスレッドで取得された値を返す
- (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view
{
[(UIImageView *)view.leftCalloutAccessoryView setImage:[self.delegate mapViewController:self imageForAnnotation:view.annotation]];
}
委任クラスは、ネットワークからイメージを取得します。 UIが応答しなくなるのを防ぐために、GCDを使用してイメージをダウンロードするための新しいスレッドが作成されます。
- (UIImage *)mapViewController:(MapViewController *)sender imageForAnnotation:(id<MKAnnotation>)annotation
{
NSURL *someURL = [[NSURL alloc] initWithString:@"a URL to data on a network"];
__block UIImage *image = [[UIImage alloc] init];
dispatch_queue_t downloader = dispatch_queue_create("image downloader", NULL);
dispatch_async(downloader, ^{
NSData *imageData = [NSData dataWithContentsOfURL:someURL]; // This call can block the main UI!
image = [UIImage imageWithData:imageData];
});
return image;
}
なぜ画像は表示されませんか?私は、デリゲートメソッドが、将来、サムネイルが最終的にそれ自身を更新する有効な画像データに設定されている画像へのポインタを返すので、それを前提としていました。これは明らかにそうではありません...
ご協力いただきありがとうございます。この解決法は残念ながら私のアプローチに対する単純な修正ではありませんが、問題ではありません。私は、画像が取得されるまで、デリゲートがメインスレッドをブロックするかもしれないと仮定して、GCDスレッドをmapviewcontrollerが処理することをやっていると思います。とにかく、返信ありがとう! –