URLから画像をダウンロードして表示(iOS, Objective-C, NSURLSession)

前回,URLから画像を取得し表示 をやりましたが,今回はURLから画像をダウンロードして表示します. これには,NSURLSessionを使います. NSURLSessionについては NSURLSession Tutorial で学べます. 僕もまだ詳しいことはわかっていないのですが,こんな流れだそうです.

  1. NSURLSessionConfigurationを作る(config)。
  2. configからNSURLSessionを作る(session)。
  3. sessionからTaskを作る(task)。
  4. タスク(task)をスタート。

コードはこんな感じになりました.imageViewというUIImageViewを定義していると仮定します.

NSString *urlString = @"http://images.moneysavingexpert.com/images/OrangeLogo.jpg";
NSURL *url = [NSURL URLWithString:urlString];

NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession *session = [NSURLSession sessionWithConfiguration:config];

NSURLSessionDownloadTask *getImageTask = [session downloadTaskWithURL:url completionHandler:^(NSURL *location, NSURLResponse *response, NSError *error) {
    UIImage *downloadedImage = [UIImage imageWithData:[NSData dataWithContentsOfURL:location]];
    dispatch_async(dispatch_get_main_queue(), ^{
        _imageView.image = downloadedImage;
    });
}];
[getImageTask resume];

今回は画像のダウンロードということで,タスクにdownloadTaskWithURLを使っています. ということはいろいろなタスクが用意されている,ということになりそうですね. そして完了したらcompletionHandlerで定義した関数が実行されます. これらは非同期処理なので,resumeをお忘れなく.

ちなみに以下のようにも書けるみたいだ.
ヘッダーファイル(別にViewControllerでなくても良い)

@interface ViewController : UIViewController <NSURLSessionDownloadDelegate>

実装ファイル

NSString *urlString = @"http://images.moneysavingexpert.com/images/OrangeLogo.jpg";
NSURL *url = [NSURL URLWithString:urlString];

NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession *session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:nil  ];

NSURLSessionDownloadTask *getImageTask = [session downloadTaskWithURL:url];
[getImageTask resume];

最後に以下のメソッドを実装ファイルに追加する.

-(void)URLSession😦NSURLSession *)session downloadTask😦NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL😦NSURL *)location {
    UIImage *downloadedImage = [UIImage imageWithData:[NSData dataWithContentsOfURL:location]];
    dispatch_async(dispatch_get_main_queue(), ^{
        _imageView.image = downloadedImage;
    });
}

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中