AFNetworking中可达性的用途是什么?

时间:2014-08-18 19:12:18

标签: ios network-programming afnetworking-2

当下载连接丢失或最初没有连接时,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;
    }
}];

2 个答案:

答案 0 :(得分:4)

  

使用AFNetworking / reachability处理可恢复下载的正确方法是什么?我是否必须创建另一个任务,因为这个任务因网络故障已经过期或有办法恢复它?

您要求的是如何在连接失败后继续下载。启动NSURLSessionDownloadTask,在下载过程中,连接失败并显示描述失败的相应NSError。当网络接口可达性发生变化时,您希望重试连接,重新使用以前下载的任何数据。

如果您的应用程序获取恢复数据并稍后将其传递给重试连接的任务,则NSURLSessionDownloadTask可以重用以前下载的数据。这是documented herehere

如果网络出现故障,返回的NSError将包含一个填充了NSURLSessionDownloadTaskResumeData密钥的userInfo字典。这将包含您需要掌握的数据。当您的应用程序再次尝试下载数据时,应使用downloadTaskWithResumeData:downloadTaskWithResumeData:completionHandler:创建下载任务,并传入简历数据。

在您的情况下,在网络故障返回带有NSURLErrorDomain的NSError,相应的错误代码和带有填充的NSURLSessionDownloadTaskResumeData密钥的userInfo字典之后,您将保留{{{的NSData值。 1}}键并开始监视可达性更改。如果网络接口返回,则在可达性更改通知处理程序中,您将使用NSURLSessionDownloadTaskResumeDatadownloadTaskWithResumeData:创建新的下载任务,并传递从NSError的userInfo字典中检索到的NSData。

答案 1 :(得分:-2)

看看这个答案。

AFNetworking + Pause/ Resume downloading big files

另一种方法是从HTTPHeaderField:@"Range"设置NSMutableURLRequest。设置此标头使用格式化的字符串,如下所示:[NSString stringWithFormat:@"bythes=%lld-", downloadedBytes]

但是当您使用AFNetworking而不是NSMutableURLRequest时,请按照我发布的链接中的说明进行操作。

值得一提的是,如果您使用NSMutableURLRequest,则必须前往您正在编写文件的位置并检查其大小以设置标头,服务器可以为您提供剩余的文件。最后下载的字节。