8

最初我认为如果NSURLSessionDownloadTask成功完成 URLSession:downloadTask:didFinishDownloadingToURL:方法将被调用,如果由于某种原因失败 - URLSession:task:didCompleteWithError:。它在模拟器上按预期工作(一个下载任务只调用此方法中的一个),但在设备上情况并非如此:如果失败,这两个方法都会被调用,URLSession:downloadTask:didFinishDownloadingToURL:第一个是第一个。(这两种方法都在参数中传递相同的任务)

有什么我想念的吗?

4

5 回答 5

3

我找到了解决这个问题的方法:

要在响应头中获取状态码,您必须首先启动一个NSURLSessionDataTask

这将调用以下委托方法URLSession:dataTask:didReceiveResponse:completionHandler:

在此方法中,您可以首先检查 NSURLResponse 参数的状态代码(通过将其转换为 NSHTTPURLResponse),最后使用 NSURLSessionResponseBecomeDownload 调用完成处理程序,您的 dataTask 转换为 downloadTask(其行为与您对 NSURLSessionDownloadTask 的预期相同) ) 或NSURLSessionResponseCancel以避免下载一些您不需要的数据(例如,如果响应的状态码是 404)。

此外,如果您需要对转换后的 NSURLSessionDownloadTask 做一些事情(比如将其存储在数组或字典中或用新对象替换数据任务),可以在URLSession:dataTask:didBecomeDownloadTask 中完成:

希望这对某人有帮助!

于 2017-08-03T17:49:08.950 回答
2

根据 Apple 在NSURLSessionDownloadDelegateIt is standard behavior 下的文档。

/* Sent when a download task that has completed a download.  The delegate should 
 * copy or move the file at the given location to a new location as it will be
 * removed when the delegate message returns. URLSession:task:didCompleteWithError: 
 * will still be called. */
于 2016-09-08T08:36:11.093 回答
2

如果您正在执行 HTTP 请求,则可以将任务的响应转换为 NSHTTPURLResponse 以获取 HTTP 状态代码:

-(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL )location { NSLog(@"response is %d\n" ((NSHTTPURLResponse)downloadTask.response).statusCode); NSLog(@"error is %@\n", [downloadTask.error localizedDescription]); }

苹果的逻辑是当你得到一个 404 时,error 仍然是 null。

于 2018-10-12T11:52:12.890 回答
1

使用完成块而不是委托:

NSURLSessionDownloadTask *mySessionDownloadTask = [myURLSession downloadTaskWithRequest:myRequest completionHandler:^(NSURL *location, NSURLResponse *response, NSError *error)
{
   dispatch_async(dispatch_get_main_queue(), ^{
      if(!error)
       {
           // Finish loading
       }
      else
       {
              // Handle error
        });
}];

注意:如果您没有获得主队列,则与用户界面相关的任何更新都将被延迟,从而导致意外行为。

于 2014-05-07T14:41:02.650 回答
-1

NSURLSessionDownloadTask是 的子类NSURLSessionTask,它有一个error属性。URLSession:downloadTask:didFinishDownloadingToURL:您可以在尝试复制文件之前在您的委托方法中检查吗?

于 2016-01-20T02:50:12.803 回答