0

我希望能够使用支持以下功能的 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];

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

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

上面的文件已下载,但临时名称很奇怪。

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

有任何想法吗?

4

2 回答 2

3
- (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);
}
于 2014-07-03T07:45:48.597 回答
-2

下载文件:

  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
于 2013-10-16T18:12:47.953 回答