最初,我认为如果NSURLSessionDownloadTask成功完成,URLSession:downloadTask:didFinishDownloadingToURL:方法将被调用,如果它由于某种原因失败- URLSession:task:didCompleteWithError:。它在模拟器上按预期工作(一个下载任务只调用其中一个方法),但在设备上情况并非如此:在失败的情况下,这两个方法都被调用,URLSession:downloadTask:didFinishDownloadingToURL:是第一个。(这两个方法在参数中传递相同的任务)
我是不是漏掉了什么?
发布于 2017-08-04 01:49:09
我找到了这个问题的解决方案:
要获取响应头中的状态代码,必须首先启动一个NSURLSessionDataTask.
这将调用以下委托方法URLSession:dataTask:didReceiveResponse:completionHandler:.
在此方法中,您可以首先检查NSURLResponse参数的状态代码(通过将其转换为NSHTTPURLResponse),最后使用NSURLSessionResponseBecomeDownload或NSURLSessionResponseCancel调用完成处理程序,以将dataTask转换为downloadTask (其行为将与您从NSURLSessionDownloadTask预期的行为相同),以避免下载一些不需要的数据(例如,如果响应的状态代码为404)。
此外,如果需要对转换后的NSURLSessionDownloadTask执行某些操作(如将其存储在数组或字典中,或者用新对象替换数据任务),则可以在do中完成
希望这对某些人有帮助!
发布于 2016-09-08 16:36:11
根据苹果在NSURLSessionDownloadDelegate下的文档,这是标准行为。
/* 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. */发布于 2018-10-12 19:52:13
如果您正在进行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的时候,错误仍然是空的。
https://stackoverflow.com/questions/23514109
复制相似问题