AFNetworking下载&仅在请求成功时保存数据

时间:2016-02-04 13:10:44

标签: ios objective-c afnetworking afnetworking-2 afnetworking-3

在我的iOS应用程序中,我使用AFNetworking库来管理所需的HTTP操作。

我创建了一个下载文件的方法:

+ (void)downloadFile:(File *)file progress:(void (^)(NSUInteger receivedBytes, long long totalReceivedBytes, long long totalExpectedBytes))progress success:(void (^)())success failure:(void (^)(NSError *error))failure
{
    NSURLRequest *request = [NSURLRequest requestWithURL:file.url];

    AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];

    operation.outputStream = [NSOutputStream outputStreamToFileAtPath:[FCFileManager pathForTemporaryDirectoryWithPath:file.key.lastPathComponent] append:NO];

    [operation setDownloadProgressBlock:^(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead)
    {
        progress(bytesRead, totalBytesExpectedToRead, totalBytesExpectedToRead);
    }];

    [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject)
    {
        success();
    }

    failure:^(AFHTTPRequestOperation *operation, NSError *error)
    {
        failure(error);
    }];

    [operation start];
}

虽然这种方法存在问题。如果正在取消下载(强制退出),则仍可在应用程序目录中找到该文件。如何创建文件下载,仅在下载成功完成后将文件保存到文档目录?

2 个答案:

答案 0 :(得分:1)

我建议下载将文件保存在临时文件位置,然后在完成块中将生成的临时文件复制到" live"地点。当应用程序启动时,临时位置中的任何数据都可以被视为不完整并已删除

答案 1 :(得分:0)

使用Foundation框架本身的NSUrlSession将自行处理失败的下载:

- (NSURLSessionDownloadTask *)downloadTaskWithResumeData:(NSData *)resumeData
                                   completionHandler:(void (^)(NSURL *location,
                                                               NSURLResponse *response,
                                                               NSError *error))completionHandler
  

只有在创建任务时才应传递nil完成处理程序   代表包括a的会话   URLSession:downloadTask:didFinishDownloadingToURL:method。

     

您的应用可以通过两种方式获取resumeData对象:

     
      
  • 如果您的应用通过致电取消现有转接   cancelByProducingResumeData :,会话对象传递resumeData   对象到您在该调用中提供的完成处理程序。

  •   
  • 如果传输失败,会话对象将提供NSError对象   要么是它的委托,要么是任务的完成处理程序。在那里面   object,userInfo中的NSURLSessionDownloadTaskResumeData键   dictionary包含resumeData对象。

  •   
     

创建任务后,必须通过调用其简历启动它   方法

     

如果请求成功完成,则该位置参数   完成处理程序块包含临时文件的位置,   并且error参数是nil。如果请求失败,则为该位置   参数为nil,error参数包含有关的信息   故障。

如果您想使用AFNetworking,它应该完全兼容,因为AFURLSessionManager可以处理NSUrlSession