itok's Lab

昔の開発ネタを記録として残してます

HTTPヘッダを確認して不要なダウンロードを避ける

同じURLに何度もアクセスに行くような場合、変更がないのにDLするのはMac側の無駄というだけでなく、サーバへの負担を考えてもあまりいいことではありません。NSURLDownloadでは実際のDL処理がはじまる前にヘッダを取得できた時にdelegateが呼び出されるので、そこでDLする必要があるかどうかを判断しましょう。

実装するdelegateはこれ。

// NSURLDownload
-(void) download:(NSURLDownload*)download didReceiveResponse:(NSURLResponse*)response;

NSURLResponse のサブクラスである NSHTTPURLResponse からHTTPのヘッダが取得できるので、それを参照します。

-(void) download:(NSURLDownload*)download didReceiveResponse:(NSURLResponse*)response
{
    if ([response isKindOfClass:[NSHTTPURLResponse class]]) {
        // HTTPヘッダ取得
        NSDictionary* headers = [(NSHTTPURLResponse*)response allHeaderFields];
        // Last-Modified を参照
        NSString* lastModStr = [headers objectForKey:@"Last-Modified"];
        // ここで時刻の比較とか
        if (...) {
            // DLの必要なし
            [download cancel];
            [download release];
            return;
        }
    }
}