使用NSURLDownload下载网页

时间:2011-11-15 04:18:08

标签: objective-c downloading

这是我的代码,它尝试使用NSURLDownload下载网页。但它不起作用,它是一个命令行程序。

- (void)startDownloadingURL
{
    NSURLRequest *theRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.apple.com/index.html"]
                                             cachePolicy:NSURLRequestUseProtocolCachePolicy
                                         timeoutInterval:60.0];

    // Create the download with the request and start loading the data.
    NSURLDownload  *theDownload = [[NSURLDownload alloc] initWithRequest:theRequest delegate:self];

    if (theDownload) {
        // Set the destination file.
        [theDownload setDestination:@"/saleh" allowOverwrite:YES];
    } else {
        // inform the user that the download failed.
        NSLog(@"download has failed!");
    }

}

2 个答案:

答案 0 :(得分:0)

确保实现downloadDidFinish和doanload:didFailWithError:callbacks。

以下是有关如何使用NSURLDownload的概述:

http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/URLLoadingSystem/Tasks/UsingNSURLDownload.html#//apple_ref/doc/uid/20001839-BAJEAIEE

具体来说,此回调将为您提供有关其失败原因的更多详细信息:

- (void)download:(NSURLDownload *)download didFailWithError:(NSError *)error
{
    // Release the connection.
    [download release];

    // Inform the user.
    NSLog(@"Download failed! Error - %@ %@",
          [error localizedDescription],
          [[error userInfo] objectForKey:NSURLErrorFailingURLStringErrorKey]);
}

编辑:

下面你说它是一个命令行。异步回调需要NSRunLoop。参见:

Cocoa: NSURLConnection not attempting an HTTP Request

根据文档:

initWithRequest:委托: 返回URL请求的初始化URL下载,并开始下载请求的数据。

- (id)initWithRequest:(NSURLRequest *)request delegate:(id)delegate
  

<强>委托

     

下载代表。该对象将接收委托   下载过程中的消息。将发送代表消息   调用此方法的线程。为了使下载正常工作   调用线程的运行循环必须在默认运行中运行   循环模式。

NSURLConnection具有下载数据的同步方式。

http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/URLLoadingSystem/Tasks/UsingNSURLConnection.html#//apple_ref/doc/uid/20001836-BAJEAIEE

  

NSURLConnection为下载内容提供支持   NSURLRequest使用类方法以同步方式   sendSynchronousRequest:returningResponse:错误:。使用这种方法是   不推荐,因为它有严重的限制:

主要限制是客户端块,但在命令行应用程序中这是一个问题。

答案 1 :(得分:0)

您需要确保至少定义downloadDidFinish:download:didFailWithError:使用委托。您只需复制并粘贴URL Loading System Programming Guide中的方法即可。

如果你在10.7上,你应该声明你在标题中也使用了协议,在Lion之前没有正式的协议。

还要确保你有一个运行循环。对于测试,您可以将[[NSRunLoop currentRunLoop] run];粘贴在那里,尽管它可能不会永远退出循环。