5

ボタンをクリックして画像のダウンロードを開始し、更新後に UIImageView を新しい画像に更新したいと考えています。私のコードの問題は、それがダウンロードするだけで、更新しないことです。もう一度クリックした場合にのみ更新されます。イメージがダウンロードされたときに、いつかイメージを更新したいと思います。それ、どうやったら出来るの?

編集:間違ったコードを見つけました。それを変更すると少し助けになり、すべて機能します。ここで別の質問が来ます - どうすればこのコードを混乱させずに単純化できますか? 過剰に見えます。

- (IBAction)getImage
{

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),
     ^{
        NSURL *imageURL = [NSURL URLWithString:@"http://example.com/1.jpg"];
        __block NSData *imageData;

         dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),
            ^{
                imageData = [NSData dataWithContentsOfURL:imageURL];


                dispatch_sync(dispatch_get_main_queue(), ^{
                                             self.image = [UIImage imageWithData:imageData];
                                         });
                                     });


     });

    self.imageView.image = self.image;
}
4

3 に答える 3

22

イメージのダウンロードが完了する前に設定しているimageViewため、ロジックをブロックに移動する必要があります。dispatch_syncまた、あなたの内部で余分なことをする理由はありませんdispatch_async

- (IBAction)getImage
{

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),
     ^{
        NSURL *imageURL = [NSURL URLWithString:@"http://example.com/1.jpg"];
        NSData *imageData = [NSData dataWithContentsOfURL:imageURL];

        //This is your completion handler
        dispatch_sync(dispatch_get_main_queue(), ^{
             //If self.image is atomic (not declared with nonatomic)
             // you could have set it directly above
             self.image = [UIImage imageWithData:imageData];

             //This needs to be set here now that the image is downloaded
             // and you are back on the main thread
             self.imageView.image = self.image;

         });
     });

     //Any code placed outside of the block will likely
     // be executed before the block finishes.
}
于 2013-02-13T19:26:31.657 に答える
2

https://github.com/rs/SDWebImageをご覧ください

進行状況の通知でバックグラウンドで画像をダウンロードするために使用します。Cocoapods ( http://cocoapods.org )を使用してプロジェクトに簡単に追加できます。

それがうまくいかない場合は、Cocoapods と GitHub で利用できる他の非同期イメージ ローダーがいくつかあります。

于 2013-02-13T19:30:36.587 に答える
0

これは私が使用してきたものですが、多くの場合役立つと思われる進歩はありません。これは簡単です。

- (void)downloadImageWithURL:(NSURL *)url completionBlock:(void (^)(BOOL succeeded, NSData *image))completionBlock
{
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

    [NSURLConnection sendAsynchronousRequest:request
                                       queue:[NSOperationQueue mainQueue]
                           completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
                               if ( !error )
                               {
                                   completionBlock(YES,data);
                                   NSLog(@"downloaded FULL size %lu",(unsigned long)data.length);
                               } else{
                                   completionBlock(NO,nil);
                               }
                           }];
}
于 2015-02-10T20:36:01.150 に答える