Скачать файл с помощью AFNetworking на iOS 6

Я недавно обновился до AFNetworking 2.0. В документации сказано, что он совместим с iOS6.0+. Я создаю приложение iOS 6.0, когда пытаюсь реализовать метод загрузки (как изображения, так и видео). Пример использования

AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration];

Однако я получил ошибку «Использование необъявленного идентификатора AFURLSessionManager». И я обнаружил, что AFURLSessionManager использует класс, доступный только в iOS7. Мне просто интересно, кого можно было скачать в iOS6 с помощью AFNetworking?

Кроме того, можно ли как-то увидеть прогресс загрузки?

Спасибо


person hook38    schedule 10.10.2013    source источник


Ответы (3)


Как вы говорите, AFURLSessionManager доступен только в iOS 7 (поддерживается NSURLSession), поэтому вам следует использовать классы на основе NSURLConnection в AFNetworking 2.0 (AFHTTPRequestOperationManager, AFHTTPRequestOperation и т. д.).

person e1985    schedule 10.10.2013
comment
ОК, нашел это... Итак, резюмируем: для поддержки новых API-интерфейсов NSURLSession, а также старого, но не устаревшего и все еще полезного NSURLConnection основные компоненты AFNetworking 2.0 разделены между операцией запроса и сессионные задачи. AFHTTPRequestOperationManager и AFHTTPSessionManager предоставляют аналогичные функции с почти взаимозаменяемыми интерфейсами, которые можно довольно легко заменить в случае необходимости (например, при переносе между iOS 6 и 7). - person hook38; 10.10.2013
comment
У вас есть пример или руководство по загрузке файлов с помощью AFHTTPRequestOperationManager? - person hook38; 10.10.2013
comment
Я не знаю, но это должно быть просто, вам просто нужно создать AFHTTPRequestOperation (вы можете использовать метод менеджера HTTPRequestOperationWithRequest:success:failure:) и установить его outputStream равным единице, указывающей на файл. - person e1985; 10.10.2013

Вы можете использовать класс AFHTTPRequestOperation для выполнения загрузки файла в iOS 6. Вам просто нужно установить свойство outputStream операции для хранения файла и свойство downloadProgressBlock для отслеживания хода выполнения.

Приведенный ниже простой метод объявлен в классе, который является подклассом AFHTTPRequestOperationManager. Когда я инициализировал экземпляр этого класса, я установил свойство baseURL.

- (AFHTTPRequestOperation *)downloadFileWithContentId:(NSString *)contentId destination:(NSString*)destinationPath {

    NSString *relativeURLString = [NSString stringWithFormat:@"api/library/zipped/%@.zip", contentId];
    NSString *absoluteURLString = [[NSURL URLWithString:relativeURLString relativeToURL:self.baseURL] absoluteString];

    NSMutableURLRequest *request = [self.requestSerializer requestWithMethod:@"GET" URLString:absoluteURLString parameters:nil];

    void (^successBlock)(AFHTTPRequestOperation *operation, id responseObject) = ^void(AFHTTPRequestOperation *operation, id responseObject) {

    };

    void (^failureBlock)(AFHTTPRequestOperation *operation,  NSError *error) = ^void(AFHTTPRequestOperation *operation,  NSError *error) {

    };

    AFHTTPRequestOperation *operation = [self HTTPRequestOperationWithRequest:request success:successBlock failure:failureBlock];

    NSOutputStream *outputStream = [NSOutputStream outputStreamToFileAtPath:destinationPath append:NO];
    operation.outputStream = outputStream;

    [operation setDownloadProgressBlock:^(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead) {

    }];

    [self.operationQueue addOperation:operation];

    return operation;
}
person TPoschel    schedule 17.10.2013

попробуй это...

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];

manager.responseSerializer = [AFHTTPResponseSerializer serializer];

AFHTTPRequestOperation *operation = [manager GET:urlString
                                      parameters:nil
                                         success:^(AFHTTPRequestOperation *operation, NSData *responseData)
                                     {
                                         [responseData writeToURL:someLocalURL atomically:YES];
                                     }
                                         failure:^(AFHTTPRequestOperation *operation, NSError *error)
                                     {
                                         NSLog(@"Downloading error: %@", error);
                                     }];

[operation setDownloadProgressBlock:^(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead)
 {
     float downloadPercentage = (float)totalBytesRead/(float)(totalBytesExpectedToRead);

     [someProgressView setProgress:downloadPercentage animated:YES];
 }];
person Friend_LGA    schedule 08.07.2014