当下载连接丢失或最初没有连接时,completionHandler会因错误而触发,连接恢复后我无法恢复。使用AFNetworking / reachability处理可恢复下载的正确方法是什么?我是否必须创建另一个任务,因为这个任务因网络故障已经过期或有办法恢复它?
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
AFURLSessionManager *man = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration];
NSURL *URL = [NSURL URLWithString:@"http://my_server.com/video/2.mp4"];
NSURLRequest *request = [NSURLRequest requestWithURL:URL];
NSURLSessionDownloadTask *downloadTask = [man downloadTaskWithRequest:request progress:nil destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) {
NSURL *documentsDirectoryURL = [[NSFileManager defaultManager] URLForDirectory:NSDocumentDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:NO error:nil];
return [documentsDirectoryURL URLByAppendingPathComponent:[response suggestedFilename]];
} completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) {
NSLog(@"File downloaded to: %@, error: %@", filePath, error);
}];
[man.reachabilityManager startMonitoring];
[man.reachabilityManager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
switch (status) {
case AFNetworkReachabilityStatusReachableViaWWAN:
case AFNetworkReachabilityStatusReachableViaWiFi:
[downloadTask resume];
break;
case AFNetworkReachabilityStatusNotReachable:
default:
[downloadTask suspend];
break;
}
}];
答案 0 :(得分:4)
使用AFNetworking / reachability处理可恢复下载的正确方法是什么?我是否必须创建另一个任务,因为这个任务因网络故障已经过期或有办法恢复它?
您要求的是如何在连接失败后继续下载。启动NSURLSessionDownloadTask,在下载过程中,连接失败并显示描述失败的相应NSError。当网络接口可达性发生变化时,您希望重试连接,重新使用以前下载的任何数据。
如果您的应用程序获取恢复数据并稍后将其传递给重试连接的任务,则NSURLSessionDownloadTask可以重用以前下载的数据。这是documented here和here。
如果网络出现故障,返回的NSError将包含一个填充了NSURLSessionDownloadTaskResumeData
密钥的userInfo字典。这将包含您需要掌握的数据。当您的应用程序再次尝试下载数据时,应使用downloadTaskWithResumeData:
或downloadTaskWithResumeData:completionHandler:
创建下载任务,并传入简历数据。
在您的情况下,在网络故障返回带有NSURLErrorDomain的NSError,相应的错误代码和带有填充的NSURLSessionDownloadTaskResumeData
密钥的userInfo字典之后,您将保留{{{的NSData值。 1}}键并开始监视可达性更改。如果网络接口返回,则在可达性更改通知处理程序中,您将使用NSURLSessionDownloadTaskResumeData
或downloadTaskWithResumeData:
创建新的下载任务,并传递从NSError的userInfo字典中检索到的NSData。
答案 1 :(得分:-2)
看看这个答案。
AFNetworking + Pause/ Resume downloading big files
另一种方法是从HTTPHeaderField:@"Range"
设置NSMutableURLRequest
。设置此标头使用格式化的字符串,如下所示:[NSString stringWithFormat:@"bythes=%lld-", downloadedBytes]
但是当您使用AFNetworking而不是NSMutableURLRequest时,请按照我发布的链接中的说明进行操作。
值得一提的是,如果您使用NSMutableURLRequest,则必须前往您正在编写文件的位置并检查其大小以设置标头,服务器可以为您提供剩余的文件。最后下载的字节。