使用AFNetworking在iOS中下载文件

我希望能够使用AFNetworking下载文件,支持:ProgressBar,Pausing和Resuming download。

我自己接近这个,我能够提出这个代码,除了它不支持暂停或恢复:

-(void)downloadFile:(NSString *)UrlAddress indexPathofTable:(NSIndexPath *)indexPath { NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:UrlAddress]]; NSString *pdfName = [self pdfNameFromURL:UrlAddress]; AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request]; NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *path = [[paths objectAtIndex:0] stringByAppendingPathComponent:pdfName]; operation.outputStream = [NSOutputStream outputStreamToFileAtPath:path append:NO]; [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { NSLog(@"Successfully downloaded file to %@", path); [self.tableView reloadData]; } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"Error: %@", error); }]; [operation setDownloadProgressBlock:^(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead) { //do something in this line with the calculation to cell float progress = (float)totalBytesRead / totalBytesExpectedToRead; [[NSNotificationCenter defaultCenter] postNotificationName:[NSString stringWithFormat:@"progress-%ld-%ld", (long)indexPath.section, (long)indexPath.row] object:@(progress)]; //Working reporting progress in cellForRowAtIndexPath. //NSLog(@"Download = %f", progress); }]; [operation start]; } 

事情是,我不知道如何管理暂停和恢复。

查看他们的文档:( https://github.com/AFNetworking/AFNetworking )他们提供了一种不同的方法来下载文件:

 NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration]; NSURL *URL = [NSURL URLWithString:@"http://www.irs.gov/pub/irs-pdf/fw4.pdf"]; NSURLRequest *request = [NSURLRequest requestWithURL:URL]; NSURLSessionDownloadTask *downloadTask = [manager downloadTaskWithRequest:request progress:nil destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) { NSURL *documentsDirectoryPath = [NSURL fileURLWithPath:[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject]]; return [documentsDirectoryPath URLByAppendingPathComponent:[targetPath lastPathComponent]]; } completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) { NSLog(@"File downloaded to: %@", filePath); }]; [downloadTask resume]; 

我希望在我的iOS’文档文件夹中正确命名“fw4.pdf”。 但是,这是记录的结果:

文件下载到:file:///Users/myName/Library/Application%20Support/iPhone%20Simulator/7.0/Applications/F4C3BC41-70B4-473A-B1F6-D4BC2A6D0A4F/Documents/CFNetworkDownload_ZkSW5n.tmp

上面的文件是IS下载的,但有一个奇怪的临时名称。

我在自己的代码中意识到我正在使用“AFHTTPRequestOperation”对象,而他们正在使用“AFURLSessionManager”。

有任何想法吗?

 - (void)downloadFile{ NSURL *url = [NSURL URLWithString:@"http://198.61.234.81/expris/uploads/attachments/file_1.pdf"]; NSURLRequest *request = [NSURLRequest requestWithURL:url]; AFHTTPSessionManager *session = [AFHTTPSessionManager manager]; NSProgress *progress; NSURLSessionDownloadTask *downloadTask = [session downloadTaskWithRequest:request progress:&progress destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) { NSURL *documentsDirectoryPath = [NSURL fileURLWithPath:[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject]]; //Here is change return [documentsDirectoryPath URLByAppendingPathComponent:[response suggestedFilename]]; }completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) { [progress removeObserver:self forKeyPath:@"fractionCompleted" context:NULL]; dispatch_async(dispatch_get_main_queue(), ^(void){ NSLog(@"File downloaded to: %@", filePath); }); }]; [downloadTask resume]; [progress addObserver:self forKeyPath:@"fractionCompleted" options:NSKeyValueObservingOptionNew context:NULL]; 

}

 - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{ NSProgress *progress = (NSProgress *)object; NSLog(@"Progress… %f", progress.fractionCompleted); } 

下载文件:

  NSData* data = [[NSData alloc] initWithContentsOfURL:/*your URL*/]; 

然后保存:

  NSString *documentsDirectory = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0]; NSString *path = [documentsDirectory stringByAppendingPathComponent:@"test.pdf"]; [data writeToFile:path atomically:YES]; 

或者您阅读CFNetworkDownload_ZkSW5n.tmp并使用pdf扩展名编写:

  NSData* data = [[NSData alloc] initWithContentsOfFile: PathYourFile]; //save code above