在我的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];
}
虽然这种方法存在问题。如果正在取消下载(强制退出),则仍可在应用程序目录中找到该文件。如何创建文件下载,仅在下载成功完成后将文件保存到文档目录?
答案 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
。