NSURLDownload [1]

NSURLDownloadを使ってURLからデータをローカルディスクにダウンロードする方法です。 直接ディスクにデータを書き込む必要が無い場合はNSURLConnectionをご利用下さい。

サンプルコード

データダウンロードサンプルを以下に示します。 「http://www.example.com/」になっているURL部分と「hoge.dat」になっているファイル名部分を変更して下さい。

以下のコードでは、NSURLConnection同様にdelegateされるためのオブジェクトを生成しています。 手元で実行して、メソッドが呼び出されていく様子を見て頂ければ幸いです。


#import <Cocoa/Cocoa.h>

// delegateされる宛先の宣言
@interface myUrlDownloadDelegate : NSObject
- (void)downloadDidFinish:(NSURLDownload *)download;
- (void)download:(NSURLDownload *)download didFailWithError:(NSError *)error;
@end


@implementation myUrlDownloadDelegate

// ダウンロード終了時に呼び出される
- (void)downloadDidFinish:(NSURLDownload *)download
{
  [download release];

  NSLog(@"downloadDidFinish");
}

// ダウンロード失敗時に呼び出される
- (void)download:(NSURLDownload *)download didFailWithError:(NSError *)error
{
  [download release];

  NSLog(@"downloadFailWithError: %@ %@",
      [error localizedDescription],
      [[error userInfo] objectForKey:NSErrorFailingURLStringKey]);
}

@end

int main(int argc, char *argv[])
{
  id pool = [[NSAutoreleasePool alloc] init];

  NSLog(@"main");

  NSURLRequest *req;
  // URLやtimeoutIntervalを必要に応じて変更して下さい
  req = [NSURLRequest
          requestWithURL:[NSURL URLWithString:@"http://www.example.com/"]
          cachePolicy:NSURLRequestUseProtocolCachePolicy
          timeoutInterval:60.0];

  // 呼び出しを受け取るためのオブジェクトを生成
  myUrlDownloadDelegate *del = [[myUrlDownloadDelegate alloc] init];

  NSURLDownload *d;
  // myUrlDownloadDelegateへdelegateしながら初期化
  d = [[NSURLDownload alloc] initWithRequest:req delegate:del];

  if (d) {
    NSLog(@"main : NSURLDownload create success");

    // ディスク書き込み時のファイル名を指定。allowOverwiteで上書き指定。
    [d setDestination:@"./hoge.dat" allowOverwrite:YES];
  } else {
    NSLog(@"main : download is nil");
    return 1;
  }

  // 実際の動作はNSRunLoopで行われます
  NSLog(@"main : Before NSRunLoop");
  [[NSRunLoop currentRunLoop] run];

  // このサンプルコードはここへ到達しません

  [pool release];
}


なお、上記サンプルコードではダウンロードが終了してもプログラムは終了しないため、Cntl-Cなどで強制終了して下さい。