NSURLDownload resumeData nil

时间:2011-03-12 12:21:56

标签: objective-c

我写了一个下载工具。它与NSURLDownload一起正常工作。 但是当谈到恢复下载时,我遇到了一些问题。 resumeData始终为零! 当我用jDownloader下载相同的文件时,停止下载并再次恢复,jDownloader恢复下载!这个文件和服务器也可以!

代码:

- (void)startDownload {
    status = @"loading";
    NSURLRequest *theRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:url] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];

    urlDownload = [[NSURLDownload alloc] initWithRequest:theRequest delegate:self];
    [urlDownload setDeletesFileUponFailure:NO];

    if (!urlDownload) {
        [self error:@"Failed starting download request!"];
    }
}

试验:

- (IBAction)stopWithResumeOption:(id)sender {
    [urlDownload cancel];
    NSData *tempData = [urlDownload resumeData];

    NSLog(@"%@",tempData);
}

如果我在加载“stopWithResumeOption”时停止下载,我总是没有! 我错过了什么吗?!

编辑:

resumeData返回什么信息?如果它只是已经下载的数据的长度或某些东西,也许我可以自己创建这个resumeData?!有人试过这个吗?

编辑2:

以下是我正在尝试恢复的一个文件的响应标头:

{
    "Accept-Ranges" = bytes;
    "Cache-Control" = "max-age=0";
    Connection = "keep-alive";
    "Content-Length" = 43346723;
    "Content-Type" = "application/pdf";
    Date = "Sun, 13 Mar 2011 13:08:44 GMT";
    Etag = 1185n;
    Pragma = public;
    Server = dbws;
    "X-Robots-Tag" = "noindex,nofollow";
}

甚至ETag也是由服务器提供的!

是否有机会这样做:

- (IBAction) resume:(id)sender {
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];
    NSString *authHeader = [NSString stringWithFormat:@"bytes=%llu-%llu",bytesReceived, totalBytesToLoad]; 
    [request addValue:authHeader forHTTPHeaderField:@"Range"];  

    urlDownload = [[NSURLDownload alloc] initWithRequest:request delegate:self];
}

但我不确定如何继续尝试...

2 个答案:

答案 0 :(得分:1)

documentation说:

  

取消

     

取消接收者的下载并删除下载的文件。

考虑通过断开与网络的连接来模拟故障。不要忘记实现委托方法。

修改

documentation也说:

  

<强> resumeData

     

如果无法恢复下载,则返回nil。

     

<强>讨论

     

只有下载协议以及服务器支持恢复

,才会返回恢复数据

您确定服务器支持恢复吗?

编辑2:

确保urlDownload方法中的nil不是stopWithResumeOption: ..

您的urlDownload方法中{p> assignedstartDownload(如何声明?)

尝试:

urlDownload = [[[NSURLDownload alloc] initWithRequest:theRequest delegate:self] retain];

并记得[urlDownload release]。{/ p>

答案 1 :(得分:0)

我知道这已经过时了,但希望这能节省一些时间。

截至目前,文档中未提及此内容,但 resumeData属性始终返回nil,除非下载被取消或失败

似乎很不幸,因为如果您的应用在下载过程中崩溃,很难恢复下载。