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などで強制終了して下さい。