Использование AFNetworking для загрузки файла в iOS

Я хочу иметь возможность загрузить файл с помощью AFNetworking, который поддерживает: ProgressBar, приостановку и возобновление загрузки.

Подойдя к этому самостоятельно, я смог придумать этот код, за исключением того, что он не поддерживает паузу или возобновление:

-(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».

Любые идеи?


person Demasterpl    schedule 16.10.2013    source источник


Ответы (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
person user2828120    schedule 16.10.2013
comment
Это не распространяется на AFNetowrking (вы используете все API Apple), а также не поддерживает приостановку, индикатор выполнения или возобновление. :( - person Demasterpl; 16.10.2013
comment
Возможно [operation setCompletionBlockWithSuccess: ^(AFHTTPRequestOperation *operation, id responseObject) { NSData* data = (NSData*)responseObject; } - person user2828120; 16.10.2013

person    schedule
comment
Пожалуйста, удалите наблюдатель, потому что из-за этого он падает, и после его удаления все работает нормально. - person Dhruv Narayan Singh; 11.02.2017
comment
Получение ошибки: Отправка «NSProgress *__strong *» в параметр несовместимого типа «void (^ _Nullable) (NSProgress * _Nonnull __strong)» - person Mihir Oza; 23.03.2020