【问题标题】:What's the use of reachability in AFNetworking?AFNetworking 中的可达性有什么用?
【发布时间】:2014-08-18 19:12:17
【问题描述】:

当下载连接丢失或最初没有连接时,completionHandler 会因错误而被触发,并且在连接恢复后我没有机会恢复。使用 AFNetworking/可达性处理可恢复下载的正确方法是什么?我是否必须创建另一个任务,因为这个任务由于网络故障已经过期或者有办法恢复它?

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;
    }
}];

【问题讨论】:

    标签: ios network-programming afnetworking-2


    【解决方案1】:

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

    您要求的是在连接失败后如何恢复下载。你启动了一个 NSURLSessionDownloadTask,在下载过程中连接失败,并出现相应的 NSError 描述失败。当网络接口可达性发生变化时,您想重试连接,重新使用任何以前下载的数据。

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

    在网络故障的情况下,返回的 NSError 将有一个 userInfo 字典,其中填充了 NSURLSessionDownloadTaskResumeData 键。这将包含您需要保留的数据。当您的应用程序尝试再次下载数据时,应使用downloadTaskWithResumeData:downloadTaskWithResumeData:completionHandler: 创建下载任务,并传入恢复数据。

    在您的情况下,在网络故障返回带有 NSURLErrorDomain 的 NSError、适当的错误代码和带有填充 NSURLSessionDownloadTaskResumeData 键的 userInfo 字典后,您将保留 NSURLSessionDownloadTaskResumeData 键的 NSData 值并开始监控可达性变化。如果网络接口恢复,在可达性更改通知处理程序中,您将使用downloadTaskWithResumeData:downloadTaskWithResumeData:completionHandler: 创建一个新的下载任务,并传递您从 NSError 的 userInfo 字典中检索到的 NSData。

    【讨论】:

      【解决方案2】:

      看看这个答案。

      AFNetworking + Pause/ Resume downloading big files

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

      但由于您使用的是 AFNetworking 而不是 NSMutableURLRequest,因此只需按照我发布的链接中的说明进行操作即可。

      值得一提的是,如果你使用 NSMutableURLRequest,你将不得不去你正在编写文件的地方并检查它的大小以设置标题,服务器可以从最后下载的字节。

      【讨论】:

      • 这不能回答我的问题,因为在帖子中没有关于 AFURLSessionManager 和可达性的内容。我的问题是如何在错误后恢复会话以及是否有可能,如何将其与可达性结合起来。
      • 为了解决这里描述的问题,我必须使用其他工具。使用其他设施不是我要求的。我特别提到了AFURLSessionManager 和可达性。
      • @artud2000 在给出任何答案之前请先仔细阅读问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多