0

Flickerから画像をダウンロードするアプリケーション(Xcode 4.5)があります。各写真の場所のピンをドロップするマップビューがあります。ピンをクリックすると、写真の名前とその画像のサムネイルを示す注釈が表示されます。メインスレッドからサムネイル画像をダウンロードすることを決定するまで、すべてが正常に機能していました(マルチスレッドでの最初の試み)。私が現在持っているコードでは、注釈はサムネイルを表示しなくなりました。

このタスクを実行するために設定した4つのメソッドがあります。4番目のメソッドは呼び出されていません。私は誰かがこのコードを見て、明らかなエラーやこれを試みる別の方法を指摘できることを望んでいます:

私のmapviewコントローラークラスでは:

//an annotation was selected
- (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)aView
{
self.currentAnnotationView = [[MKAnnotationView alloc]init];
self.currentAnnotationView = aView;
[self.delegate mapViewController:self 
    imageForAnnotation:self.currentAnnotationView.annotation];
}

委任を使用して、上記のメソッドは私のテーブルビューコントローラークラスで以下を呼び出します。

// downloads Flickr image
- (void )mapViewController:(MapViewController *)sender imageForAnnotation:    
      (id<MKAnnotation>)annotation
{      
FlickrPhotoAnnotation *fpa = (FlickrPhotoAnnotation *)annotation;

dispatch_queue_t downloadQueue = dispatch_queue_create("flickr annotation image  
       downloader", NULL);
dispatch_async(downloadQueue, ^{
    NSURL *url = [FlickrFetcher urlForPhoto:fpa.photo format:FlickrPhotoFormatSquare]; 
    NSData *data = [NSData dataWithContentsOfURL:url];
    self.thumbnailImage = [UIImage imageWithData:data];
        dispatch_async(dispatch_get_main_queue(), ^ {
            MapViewController *mvc = [[MapViewController alloc]init];
            [mvc setAnnotationImage];  
        });
    });
}

上記のメソッドは、mapviewコントローラークラスのインスタンスを介して以下のメッセージを呼び出します。

//gets thumbnail image and sets it to the annotation view
 - (void)setAnnotationImage
 {
 UIImage *image = [self.delegate getThumbnailImage];
 [(UIImageView *)self.currentAnnotationView.leftCalloutAccessoryView setImage:image];
 }    

最後に、上記のメソッドは委任を使用して、テーブルビューコントローラークラスで以下のメソッドを呼び出します(呼び出されていません-理由はわかりません)。

//returns the thumbnail image acquired in download
 - (UIImage *)getThumbnailImage;
 {
    return self.thumbnailImage;
 }  
4

1 に答える 1

1

2番目のmapViewControllerのデリゲートを設定していないため、メソッドは呼び出されません。

dispatch_async(dispatch_get_main_queue(), ^ {
            MapViewController *mvc = [[MapViewController alloc]init];
            [mvc setAnnotationImage];  
            [mvc setDelegate:self];
        });

する必要があります:

dispatch_async(dispatch_get_main_queue(), ^ {
            MapViewController *mvc = [[MapViewController alloc]init];
            [mvc setDelegate:self];
            [mvc setAnnotationImage];  
        });

...ただし、新しいmapViewControllerを作成するのではなく、既存のmapViewController(送信者)に注釈画像を設定する必要があります。

dispatch_async(dispatch_get_main_queue(), ^ {
            [sender setAnnotationImage];  
        });

...そしてsetAnnotationImageの呼び出しでは、UIImageを渡して(メッセージを渡すときにその情報があるため)、最後のデリゲートコールバックの必要性をなくすことができます。

画像を受け取るようにsetAnnotationImageメソッドを変更します。

- (void)setAnnotationImage:(UIImage*)image
 {
 [self.currentAnnotationView.leftCalloutAccessoryView setImage:image];
 }  

次に、一度に設定できます。

dispatch_async(dispatch_get_main_queue(), ^ {
            [sender setAnnotationImage:self.thumbnailImage];  
        });

...そしてself.thumbnailImageは、これを取得する必要がある唯一の場所である場合、iVarである必要はないかもしれません...

于 2012-12-19T22:17:45.677 に答える